Unity(光子/网络):如何移动其他玩家实例化的对象?

时间:2017-07-11 11:58:52

标签: unity3d

将我的Photon项目保持在给定的500 msg / s下是非常棘手的。即使在房间中有10个玩家,每个更新位置每秒10次10​​(玩家)* 10(发送消息)* 10(接收消息)= 1000msg / s被生成。这只是玩家运动。接下来我需要移动子弹,这将再次增加消息量。

目前我已经通过网络实例化了子弹,但只有本地玩家可以移动它,因为我还没有同步子弹的移动。我想知道我可以让所有客户在实例化后开始在本地设备上移动子弹而不是通过网络传递位置吗?这将节省大量的消息,因为我永远不必通过网络发送子弹位置。

黑客和作弊在我的游戏中不是问题。

编辑:这是我目前用来移动子弹的脚本。这仅适用于实例化子弹的设备本地。我如何在每个客户端本地运行此脚本?

public class Network_Bullet : Photon.MonoBehaviour {

    private Rigidbody2D rb;

    [HideInInspector]
    public float speed = 0;
    [HideInInspector]
    public Vector2 direction = Vector2.zero;

    public void SetValues(float _speed, Vector2 _direction)
    {
        rb = GetComponent<Rigidbody2D> ();

        this.speed = _speed + 150f; // bullet has 150 more speed than player
        this.direction = _direction;
    }

    private void Update()
    {
        if (speed != 0) 
        {
            rb.velocity = direction * speed * Time.fixedDeltaTime;
        }
    }

}

以下是如何实例化子弹:

private void OnClick_Shoot()
    {
        if (photonView.isMine == true) 
        {
            if (timeSinceLastBullet >= spawnTime) 
            {
                GameObject newBullet = PhotonNetwork.Instantiate (Path.Combine ("prefabs", "Network Bullet"), transform.position, transform.rotation, 0);
                newBullet.GetComponent<Network_Bullet> ().SetValues (owner.speed, new Vector2(owner.last_horizontal, owner.last_vertical));

                timeSinceLastBullet = 0f;
            } 
            else 
            {
                Debug.Log ("loading...");
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

首先,每秒有10个移动消息的10个玩家每个房间每秒产生100条消息。 对于实际问题 - 对于子弹,你需要做的只是实例化并给它初始旋转和速度。因为子弹通常不会改变它们的旋转或速度(至少在视频游戏中),你只需要这样做并且只更新每个人的本地机器中的子弹。

答案 1 :(得分:0)

你可以试试这个:

private void OnClick_Shoot()
{
    if (timeSinceLastBullet >= spawnTime) 
    {
        int level = 2; //it is not need for you, but you can setup some params on object
        // for example i set level for increase damage per level.
        string someMsg = "hi i'm bullet";
        object[] parametres = new object[] {
           level,
           someMsg
        }
        PhotonNetwork.Instantiate (Path.Combine ("prefabs", "Network Bullet"), transform.position, transform.rotation, 0, parametres );

        timeSinceLastBullet = 0f;
    } 
    else 
    {
        Debug.Log ("loading...");
    }
}

子弹,只需在预制件上添加PhotonView组件即可正常工作

public class Bullet : MonoBehaviour {

   private Rigidbody2D rb;

   [HideInInspector]
   public float speed = 0;
   [HideInInspector]
   public Vector3 direction = Vector3.zero;

   void Start()
   {
       rb = GetComponent<Rigidbody2D> ();

       this.speed = _speed + 150f; // bullet has 150 more speed than player
       this.direction = _direction;

       PhotonView pView = gameObject.GetPhotonView();
       // or
       //PhotonView pView = gameObject.GetComponent<PhotonView>();

       damage = 10 * pView[0]; // increase damage per level
       Debug.Log(pView[1]);

   }

   void Update()
   {
       if (speed != 0) 
       {
           rb.velocity = direction * speed * Time.fixedDeltaTime;
       }
   }
}

因此,这些方法将适用于所有客户端。我在我的子弹上使用它。