You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity Photon PUN中本地玩家旋转引发其他玩家同步旋转的问题

解决2D多人射击游戏本地玩家旋转影响其他玩家的问题

核心问题是你的旋转逻辑被所有玩家对象执行了——每个玩家的脚本都会根据本地鼠标位置计算旋转,当光标靠近其他玩家时,那个玩家的脚本会算出指向鼠标的角度,导致它跟着旋转。要实现仅本地玩家旋转,只需给旋转和输入逻辑加上本地玩家判断。

修改步骤:

  1. 给玩家脚本添加本地玩家标识:如果用Unity官方网络框架(如UNet),直接使用NetworkBehaviour自带的isLocalPlayer属性;如果是自定义网络方案,自己维护一个bool isLocalPlayer变量,在生成玩家时给本地玩家设为true,远程玩家设为false。
  2. 将鼠标旋转、射击等输入驱动的逻辑,包裹在本地玩家判断条件内,仅让本地玩家执行。
  3. 远程玩家的旋转通过网络同步实现:本地玩家旋转后,将旋转角度/状态同步到服务器,再由服务器同步给其他客户端,远程玩家直接使用同步过来的值更新旋转,不自行计算。

修改后的代码示例:

this.mousePos = cam.ScreenToWorldPoint(Input.mousePosition);

if (Input.GetButton("Fire1") && Time.time > nextTimeToFire)
{
    // 射击逻辑仅本地玩家执行
    if (isLocalPlayer) 
    {
        GameObject bullet1 = Instantiate(bullet, firepoint.position, firepoint.rotation);
        Rigidbody2D rb2 = bullet1.GetComponent<Rigidbody2D>();
        rb2.AddForce(firepoint.right * 50f, ForceMode2D.Impulse);
        ScreenManager.Instance.ScreenShake(10f, 0.1f);
        Destroy(bullet1, 20f);
        nextTimeToFire = Time.time + 1f/fireRate;
    }
}

// 仅本地玩家执行旋转计算
if (isLocalPlayer)
{
    Vector2 lookDir = this.mousePos - rb1.position;
    float angle = Mathf.Atan2(lookDir.y, lookDir.x) * Mathf.Rad2Deg;
    transform.eulerAngles = new Vector3(transform.rotation.x, transform.rotation.y, angle);
    
    // 这里添加旋转同步逻辑,比如用SyncVar标记角度,或发送命令给服务器更新旋转状态
    // 示例(UNet):CmdSyncRotation(angle);
}

补充说明:

  • 移除所有非本地玩家的输入逻辑,避免远程玩家响应本地鼠标操作。
  • 远程玩家的旋转必须依赖网络同步数据,不能让每个客户端独立计算,否则会出现不同步或误触发的问题。

内容的提问来源于stack exchange,提问作者Lam Dang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:33:11