13.坦克和炮台的同步
【坑点二】Unet版本的hook函数在Mirror中是不一样的。
【填坑】
以前是[SyncVar(hook="onFunction")],且onFunction函数的参数为一个;
现在是[SyncVar(hook=nameof(onFunction))],其中onFunction的参数必须2个,第一个是旧值,第二个是新值。如onFunction(size oldValue, size newValue)。
由于NetworkTransform实现的是Player整体位置的同步,而炮台的旋转无法实现同步,所以需要另外重写,player.cs更新如下代码实现炮台移动同步
public class Player : NetworkBehaviour
{
……
//将以下变量在面板中隐藏
[HideInInspector]
//当turretRotation变量发生改变时调用OnTurretRotation函数
[SyncVar(hook=nameof(RotateTurret))] public int turretRotation;
……
private void FixedUpdate()
{
……
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 返回从摄像机到当前鼠标点的一个射线
Plane plane = new Plane(Vector3.up, Vector3.up); // 新建一个平面,因为玩家对象在(0,0,0),所以参数中的法线和经过的点都是(0,1,0)
float distance = 0f;
Vector3 hitPos = Vector3.zero;
// 判断平面和射线是否相交,并将射线起点到交点的距离返回给distance
if (plane.Raycast(ray, out distance))
{
hitPos = ray.GetPoint(distance) - transform.position; // 获得射线在distance位置的坐标 - 玩家的坐标 = 相对玩家的交点坐标
}
Vector2 direction = new Vector2(hitPos.x, hitPos.z);
if (direction != Vector2.zero)
{
// 因为炮台的z轴要指向射线和平面的交点,所以用LookRotation函数,只需要用到forward参数即可(z轴指向forward),
// 最后返回一个表示旋转的四元数,并得到它转换后欧拉角中绕y轴旋转的角度
turretRotation = (int) (Quaternion.LookRotation(new Vector3(direction.x, 0, direction.y)).eulerAngles.y);
turret.r