
# 开发指导
#### 开发流程
创建和开发流程如[图1]所示。
图1流程图   
![](https://support.huaweicloud.com/devg-koomap/zh-cn_image_0000001550577197.png "点击放大")
#### 开发过程
1. 配置AK/SK信息。 
   在新建的Unity工程"Assets \> HTFoundation \> Scripts \> BaseUtils"中找到HTStringConfig.cs，并在HTStringConfig.cs配置AK/SK信息以及输入固定的BASE_URL。
   ![](https://support.huaweicloud.com/devg-koomap/public_sys-resources/note_3.0-zh-cn.png)
   - 申请AK/SK详情请参考[获取AK/SK](https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html)。
   
   - 固定BASE_URL为：https://koomap.cn-north-4.myhuaweicloud.com。
    
   ```
   // 认证用的AK、SK硬编码到代码中或明文存储都有很大的安全风险，建议在代码中配置加密后的AK、SK，在使用的地方解密。
   public class HTStringConfig
   {
       public const string AK = "加密后的内容";
       public const string SK = "加密后的内容";
       public const string BASE_URL = "";
   }
   ```
   
   
2. 创建HTFoundationOrigin。 
   单击Unity菜单栏"Custom Tools \> Create"中的"HTFoundationOrigin"，Unity会自动创建Prefab。
   
   
3. 配置功能。 
   展开"HTFoundationOrigin"目录并单击"HTSysEntrance"，根据实际情况配置需要的功能。其中默认配置HTRes（资源加载）、HTNavi（导航功能）、HTGvps（定位功能）。
   配置完成后，启动当前场景，自动获取状态信息，开启视觉定位和加载数字资源：
   - 视觉定位：自动定位和手动定位。
     - 自动定位**：**
       系统默认开启自动定位功能。在定位丢失状态下，每隔1秒刷新一次定位，直到成功。定位成功状态下，每隔15秒刷新一次定位。您可根据实际需求设置刷新时间。
       ```
       // 第一个参数是定位丢失时的定位刷新时间，第二个参数是定位成功后的定位刷新时间
       mHtSystem.Start(HTSystemManager.FastLocinterval, HTSystemManager.NormalLocaIntervalNonVpp);
       ```
       
     
     - 手动定位**：**
       1. 创建HTGvpsRequestOpExt实例。
          ```
          protected HTGvpsRequestOpExt mGvpsOp = new HTGvpsRequestOpExt();
          ```
          
       
       2. 调用HTGvpsRequestOpExt的RequestGvpsLocaiton方法进行一次手动定位请求。
          ```
          mGvpsOp.RequestGvpsLocaiton(HTSystemManager.GetHTSystem(), HTRequestPriority.ForceRequest, HTVpsRequestType.ManualClick, OnLocation);
          ```
          
       
       3. 通过HTGvpsRequestOpExt类的Addobserver方法将定位添加到SDK系统的监听池中。 定位结果将通过HTGvpsRequestOpExt类中的OnLocation方法返回。
          ```
          mGvpsOp.AddObserver(HTSystemManager.GetHTSystem());
          ```
          ![](https://support.huaweicloud.com/devg-koomap/public_sys-resources/note_3.0-zh-cn.png)
          您可在Unity新建工程的"Assets \> HTFoundation \> Samples \> HTFoundationTester \> Scripts"中找到HTManualReq.cs并查看参考实例。
          
        
      
   
   - 加载数字资源**：**
     HTResManager为场景中挂载的类，控制着HTResSession类的创建以及资源加载流程的生命周期。
     HTResSession构造了资源管理类HTResPumper和资源渲染类HTResRender，主要对外提供了dll的生命周期，相对于Unity生命周期的映射及内容回调。
     对资源模块的信息配置及功能调整，都可以在这里进行。
     HTResCtro主要进行资源材质的二次赋值，能很好的修复PC端加载资源出现材质丢失的问题，主要方法为FixShader(GameObject obj)。
     核心方法代码如下：
     ```
     public void Create(bool isRequestDigital = true, bool isUseSecondaryOffset = true)
             {
                 Debug.Log("HTResSession Create HTPerformance +");
                 if (mHTBehaviourFactory == null)
                 {
                     mHTBehaviourFactory = new HTBehaviourFactory();
                 }
                 bool isResLstOnline = true;
                 bool isResLstDump = false;
                 bool isResCacherDe = false;
                 mResRender = new HTResRender(mOwner, mHTBehaviourFactory);
                 mResPumper = new HTResPumper(
                     HTSystemManager.GetHTSystem().GetAppConfig(),
                     HTSystemManager.GetHTSystem().GetAppEnv(),
                     HTSystemManager.GetHTSystem().GetWorldControl(),
                     HTSystemManager.GetHTSystem().GetSniffer(),
                     HTSystemManager.GetHTSystem().GetJniAttach(),
                     mResRender,
                     mSysSession.mHostUrl,
                     Application.temporaryCachePath,
                     mSysSession.mPlaformType,
                     isResLstOnline,
                     isResLstDump,
                     isResCacherDe,
                     isRequestDigital,
                     isUseSecondaryOffset 
                     );
                 mResRender.SetRealWordMatPath(HTStringMat.WORLD_REAL);
                 ((IHTActor)(mResPumper)).Create("resPumper");
                 Debug.Log("HTResSession Create HTPerformance -");
             }
     ```
     
   
   
   相关参数解释如下：
   - HTBehaviourFactory：资源的行为脚本厂类，SDK提供了一套通用的行为供用户使用，用户也可以创建自己的行为厂类，需继承IHTBehaviourFactory接口类。
   
   - isResLstOnline：是否加载在线资源（加载离线资源需先缓存Dump，并且把缓存的TXT放在Application.temporaryCachePath下的ResLstCache文件夹内）。
   
   - isResLstDump：是否缓存资源列表的TXT。
   
   - GetAppConfig：获取应用鉴权参数。
   
   - GetAppEnv：获取App环境参数。
   
   - GetWorldControl：获取资源世界的参数，例如是否在服务区、获取坐标偏移量等信息。
   
   - GetSniffer：获取定位及传感器信息。
   
   - GetJniAttach：子线程向Android客户端发送信息时需要使用。
   
   - mResRender：HTResRender.dll的实例。
   
   - mHostUrl：存储云端数字资源的域名。
   
   - mPlaformType：当前移动设备的平台（Android或iOS）。
   
   - isRequestDigital：是否需要加载数字资源。
   
   - isUseSecondaryOffset：是否开启[二次偏移](https://support.huaweicloud.com/devg-koomap/koomap_04_0032.html#koomap_04_0032__li1591014710287)。
   
   
   ![](https://support.huaweicloud.com/devg-koomap/public_sys-resources/note_3.0-zh-cn.png)
   资源模块运行时，判断当前位置是否在服务区，可通过如下接口进行判断：
   ```
   int serviceid = HTSystemManager.GetHTSystem().GetWorldControl().GetServiceCode();
   ```
   其中，返回的serviceid参数解释如下：
   - serviceid \> 0：在服务区
   
   - serviceid = 0：未知
   
   - serviceid \< 0：不在服务区
    
   
   
 
