【Unity3D-Mirror多人坦克大战】坦克和炮台移动的同步、右键视角的切换(三)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~Lomiss~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值