4.主要 API 說明(Core API Reference)
這一部分對應 SDK 內的函式與主要 API 功能,這邊介紹的 SDK 皆指 CHTLandProxy 底下的所有 API 功能。
4-1 連線相關 API
連線狀態與房間控制: IMultiConnectManager
連線事件監聽與呼叫: IMultiActManager
(1)如果要取得連線狀態相關功能,請實作 IMultiConnectCallback 介面,並在需要監聽前進行註冊事件的呼叫。
IMultiConnectManager 範例代碼
public class ServerData : MonoBehaviour,IMultiConnectCallback
{
// 在要監聽前的階段先進行註冊
void OnEnable()
{
CHTLandProxy.multiConnectManager.RegisterCallback(this);
}
// 實作介面的事件,當有觸發時會自動走進這邊
public void OnConnectStateChanged(ConnectState connectState)
{
if (connectState == ConnectState.Connected)
{
// 已完成連線 toDo...
}else if (connectState == ConnectState.Connecting)
{
// 連線中 toDo...
}else if(connectState == ConnectState.Disconnected )
{
// 斷線 toDo...
}
}
// 當房間人數變動時,這邊會通知
public void OnPlayersChange(int count)
{
// toDo...
}
// 如果房間滿時,判斷加入別的房間去
public void ReTryJoinRoom()
{
CHTLandProxy.multiConnectManager.Connect(ConnectType.RandomJoin);
}
// 控制角色返回大廳
public void BackToLobby()
{
CHTLandProxy.multiConnectManager.DisConnect();
}
// 檢查是不是 Master 身分
public bool GetIsMaster()
{
return CHTLandProxy.multiConnectManager.CheckIsMaster();
}
}
(2) 如果要監聽與推播同步資訊相關功能,請實作 IMultiActManager 介面,並在需要同步事件前進行註冊完畢。
IMultiActManager 範例代碼
public class ServerData : MonoBehaviour,IMultiActManager
{
// 請確保 IMultiActManager 註冊事件執行在 IMultiConnectManager 註冊後
// 且已完成 Avatar 角色的生成
// 註冊過後,才能接收到 int / float / string / RPC 的事件推播
void RegisterCallback()
{
CHTLandProxy.multiActManager.RegisterCallback(this);
}
// 監聽 int 數值變化 (數值與前次不同才會通知)
void OnIntegerChanged(int index, int value)
{}
// 監聽 string 字串變化 (字串與前次不同才會通知)
void OnStringChanged(int index, string value)
{}
// 監聽 float 數值變化 (數值與前次不同才會通知)
void OnFloatChanged(int index, float value)
{}
// 監聽 RPC 事件通知
void OnRPC_Called(int ivalue, string svalue)
{}
// 發送 int 事件的數值
public void Call_ChangInt(IntAction index, int value)
{
CHTLandProxy.multiActManager.ChangeInteger((int)index, value);
}
// 發送 RPC 事件推播
public void Call_ChangeRPC(RPCAction ivalue, string svalue)
{
CHTLandProxy.multiActManager.RequestAuthority();
CHTLandProxy.multiActManager.CallRPC((int)ivalue, svalue);
}
// Master 設定同步物件 最多3個 (可進行 position / rotation 同步)
public void BindGameObject(int index, GameObject go)
{
CHTLandProxy.multiActManager.BindGameObject(index, go);
}
// 非 Master 人員取得同步物件
public GameObject GetBindGameObject(int index)
{
return CHTLandProxy.multiActManager.GetGameObject(index);
}
}
4-2 鏡頭控制相關 API
控制鏡頭本身事件: ICameraManager
控制鏡頭追隨事件: IInputManager
鏡頭調整 範例代碼
// 晃動鏡頭 參數可自己調整
public void ShakeCamera()
{
CHTLandProxy.cameraManager.Shake(0.2f, 5f);
}
// 控制鏡頭追隨 Avatar 的距離遠近
public void SetCamera(float distance)
{
CHTLandProxy.cameraManager.SetZoomDistance(distance);
}
// 切換鏡頭追隨其他人
public void ChangeCamera(GameObject go)
{
CHTLandProxy.InputManager.CameraChangeTarget(go);
}
// 切換鏡頭追隨自己的 Avatar
public void SetSelfCameraBack()
{
CHTLandProxy.InputManager.CameraChangeBack();
}
4-3 UI項目控制相關 API
UI 介面功能控制: IGUIManager
UI 項目控制 範例代碼
// 開關 Joystick 預設 Web 是關閉的
public void SetJoystickButtonState(bool state)
{
#if !UNITY_WEBGL
CHTLandProxy.guiManager.OpenJoystickButton(state);
#endif
}
4-4 成就任務控制相關 API
成就任務完成通知: IMissionManager
成就任務完成通知 範例代碼
// scene_id : 從創作者網站各自場景管理頁面內可取得 ID 資料
// mission_id : 從創作者網站建立成就任務後,可取得每階段的 mission ID
// 通知伺服器端後,伺服器端會判斷是否該使用者已得過此成就,如果尚未取得此成就則會通知使用者完成此階段
// 此任務事件在 Test 環境下,開發者每次都會觸發,但不會獲得對應獎勵
// 在 Publish 環境下,只有尚未完成成就時,才會觸發
public void SetMission(string scene_id, string mission_id)
{
CHTLandProxy.missionManager.SetMissionDone(scene_id, mission_id);
}
4-5 使用者個人資料相關 API
取得使用者個人資料: IUserManager
使用者個人資料取得 範例代碼
// 取得角色暱稱
public string GetUserNickName()
{
return CHTLandProxy.userManager.GetNickname();
}
4-6 Player 與 Avatar 同步相關 API
Player 與 Avatar 資料顯示、控制、管理: IPlayerManager
(1) Player 相關功能 範例代碼
// 控制角色是否可以移動
public void SetAvatarFrozen(bool state)
{
CHTLandProxy.playerManager.GetLocalPlayer().SetAvatarFrozen(state);
}
// 設定角色移動到某個位置
public void SetAvatarPosition(Vector3 v3)
{
CHTLandProxy.playerManager.GetLocalPlayer().SetAvatarPosition(v3);
}
// 是否要顯示角色姓名在各自 Avatar 頭上
public void SetBandState(bool state)
{
CHTLandProxy.playerManager.GetLocalPlayer().SetBandShow(state);
}
// Player 本身帶血量 預設 0
public void SetHp(int hp)
{
CHTLandProxy.playerManager.GetLocalPlayer().SetHP(hp);
}
// 取得自己 Player 血量
public int GetHp()
{
return CHTLandProxy.playerManager.GetLocalPlayer().GetHP();
}
// 設定角色身份類型
public void SetPlayerType(string type)
{
CHTLandProxy.playerManager.GetLocalPlayer().SetPlayerType(type);
}
// 更改角色走路與跑步的移動速度
public void SetSpeed(float walk, float run)
{
CHTLandProxy.playerManager.GetLocalPlayer().SetWalkSpeed(walk);
CHTLandProxy.playerManager.GetLocalPlayer().SetRunSpeed(run);
}
// 控制角色 Collider 狀態
public void SetAvatarCollider(bool state)
{
CHTLandProxy.playerManager.GetLocalPlayer().SetUseCollider(state);
}
// 獲取本身 Avatar 物件
public GameObject GetAvatarObject()
{
return CHTLandProxy.playerManager.GetLocalPlayer().
}
//取得自己的 User ID
public string GetSelfUserID()
{
return CHTLandProxy.playerManager.GetLocalPlayer().GetUserId();
}
// 取得房間所有人的 Avatar 資訊
public List<PlayerInfo> GetPlayersList()
{
return CHTLandProxy.playerManager.GetLocalPlayer().GetPlayers();
}
(2) Avatar 更換 Skin 、掛載物件 與 恢復 範例代碼
// 把自己的Avatar換回原本的Skin
public void ResetAvatarSkin()
{
CHTLandProxy.playerManager.GetLocalPlayer().GetAvatar().ResetAvatar();
}
// goName : 為變更要穿戴的 Skin 物件名稱 ( Skin 請確認有放在場上,且不要跟其他物件重複名稱)
// gender : 可以變更性別 (影響到預設的動畫行為)
public void ChangeAvatarSkin(string goName, Gender gender)
{
CHTLandProxy.playerManager.GetLocalPlayer().GetAvatar().ReplaceAvatar(goName, gender);
}
// 移除身體某部位所放置的物件
public void RemoveAttachment(string goName,HumanBodyBones boneToAttach)
{
CHTLandProxy.playerManager.GetLocalPlayer().GetAvatar().RemoveAttachment(goName, boneToAttach);
}
// 將額外物件掛載在身體某部位,並可以進行位置、角度跟尺寸的調整
public void AddAttachment(string goName,HumanBodyBones boneToAttach, Vector3 position, Quaternion rotation, Vector3 scale)
{
CHTLandProxy.playerManager.GetLocalPlayer().GetAvatar().AddAttachment(goName,
boneToAttach,
position,
rotation,
scale
);
}
(3) Avatar 變更動作 範例代碼
// 播放一次自定義動作
public void Play_Ani(string animationName)
{
CHTLandProxy.playerManager.GetLocalPlayer().GetAvatar().PlayAnimationClip(animationName, true);
}
// 停止播放動作 恢復預設Idle狀態
public void Stop_Ani()
{
CHTLandProxy.playerManager.GetLocalPlayer().GetAvatar().StopAnimationClip();
}