閱讀本文大約需要6分鐘。
Unity3D中關于多人游戲的基本實現方法,可參考官方實例教程:https://unity3d.com/learn/tutorials/topics/multiplayer-networking
一般情況下,當不需要限制鏡頭旋轉時,可以將鏡頭作為角色(Player)的子物體(Child gameobject),隨角色一同生成。由于角色一般使用(isLocalPlayer)來確定控制權限,因此鏡頭也自然地只跟隨本地角色的控制進行移動。這種方式適合絕大多數的第一/第三人稱游戲和2D游戲。
然而,如果你的游戲需要鏡頭跟隨角色移動、保持固定高度、并且不能隨角色旋轉而轉動,比如《王者榮耀》。這種情況下,將鏡頭作為子物體隨角色生成的方式便難以使用。
此時,較為簡單的實現方式如下:
-
確保Main Camera 與 Player 沒有“父子”關系;
- 給Main Camera添加Camera Follow腳本;
// CamFollow.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CamFollow : MonoBehaviour {
private Transform m_TargetTransform; // 鏡頭要跟蹤的目標
private float depth = -7f; // 鏡頭相對于角色的前后位置,負數代表位于角色后方;
[SerializeField]
private float m_Speed = 10f; // 控制鏡頭跟蹤時的速度,用于調整鏡頭額平滑移動,如果速度過大,極限情況下直接把目標位置賦給鏡頭,那么對于閃現一類的角色瞬移效果,將會帶來不利的視覺影像
void Update(){
if(m_TargetTransform != null)
{
var targetposition= m_TargetTransform.position + new Vector3(0,22,depth);
transform.position = Vector3.MoveTowards (transform.position,targetposition,m_Speed*Time.deltaTime);
}
}
public void SetTarget(Transform target){
m_TargetTransform = target;
}
}
- 在角色控制腳本中,重寫OnStartLocalPlayer()方法:
//PlayerControl.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityStandardAssets.CrossPlatformInput;
public class PlayerControl : NetworkBehaviour {
...
public override void OnStartLocalPlayer()
{
Camera.main.GetComponent<CamFollow> ().SetTarget (gameObject.transform);
//當本地角色生成后,調用CamFollow的SetTarget()方法,將本地角色作為目標供鏡頭跟蹤;
}
}
至此,我們的目標已經實現。因為角色是由本地控制,而鏡頭的目標是本地角色,因此在每一個客戶端里,鏡頭都只會跟隨本地角色移動。