【问题标题】:Photon Network Spawn Players At Different Points光子网络在不同点产生玩家
【发布时间】:2020-05-18 17:11:37
【问题描述】:

我正在尝试使用 Photon Networking For Unity 制作 RTS 游戏。我要做的是取决于特定房间中的玩家(本例中为 2 个),所有玩家都在不同的位置生成。我遇到的麻烦是制作一个系统,该系统在游戏开始并调用PhotonNetwork.Instantiate 时在不同位置而不是在同一个位置生成玩家。如何使用带有列表的 SpawnPositions 来检查玩家是否已经在给定位置生成,如果是,那么它会在下一个位置生成我希望我涵盖了所有内容,如果您需要知道其他任何内容,请询问。

        private GameObject playerPrefab; // Players Prefab
        [SerializeField]
        public Transform[] SpawnPositions; // 2 Spawn Positions in The unity hierarchy

        public List<Vector3> spawnPoints = new List<Vector3>(); // List of spawnpoints to add to

        void Start()
        {

        PhotonNetwork.Instantiate(playerPrefab.name, [what to do here], Quaternion.Euler(0, 0, 0));

        }

【问题讨论】:

    标签: c# unity3d instantiation photon spawning


    【解决方案1】:

    编辑 2:使用 Transform[] SpawnPositions

    private int spawnIndex;
    ...
    void CreatePlayerObject()
        {
            if(spawnIndex >= SpawnPositions.length) spawnIndex = 0;
            Vector3 position = SpawnPositions [spawnIndex].transform.position;
    
            GameObject newPlayerObject = Instantiate(player, position, Quaternion.identity);
            spawnIndex++;
        }
    ...
    

    结束编辑 2

    你可以制作出生点。我让生成点自动找到正确的高度。如果您不需要自动高度,则可以使用空的 MonoBehaviour 甚至使用标签。您可以使用此脚本在不同位置制作多个 GameObjects。

    ...
    public class spawnPoint : MonoBehaviour {
        public bool autoHeight = true;
        public LayerMask putOnTopOfThese;
        // Use this for initialization
        void Start () {
            RaycastHit hit;
            Physics.Raycast (transform.position + Vector3.up * 100, -Vector3.up, out hit, 200, putOnTopOfThese);
            transform.position = hit.point + Vector3.up;
        }
    }
    
    

    要让每个玩家生成在不同的位置,您可以在生成点之间循环。请记住,如果您对生成点使用标签而不是 MonoBehaviour,则需要使用 GameObject.FindObjectsWithTag 而不是 FindObjectsOfType

    在不同位置产卵:

    private int spawnIndex;
    ...
    void CreatePlayerObject()
        {
            spawnPoint[] sp = GameObject.FindObjectsOfType<spawnPoint> ();
            if(spawnIndex >= sp.length) spawnIndex = 0;
            Vector3 position = sp [spawnIndex].transform.position;
    
            GameObject newPlayerObject = Instantiate(player, position, Quaternion.identity);
            spawnIndex++;
        }
    ...
    

    对于随机生成:

    ...
    void CreatePlayerObject()
        {
            spawnPoint[] sp = GameObject.FindObjectsOfType<spawnPoint> ();
            int chosen = Random.Range (0, sp.Length);
            Vector3 position = sp [chosen].transform.position;
    
            GameObject newPlayerObject = Instantiate(player, position, Quaternion.identity);
        }
    ...
    

    编辑:清晰度

    【讨论】:

    • spawnPoint[] 这是什么代表 ik 一个数组,但我有一个数组作为 SpawnPositions
    • "spawnPoint" 是我附加到生成点的 MonoBehaviour 的名称。您可以将“sp”替换为 SpawnPositions 并删除 spawnPoint[] sp = GameObject.FindObjectsOfType&lt;spawnPoint&gt; ();
    • 这行不通。因为两个玩家都将在生成位置 [0] 生成。您需要先通过光子网络同步阵列。
    【解决方案2】:

    谢谢 bazilbaachu(https://answers.unity.com/users/1127669/bazilbaachu.html)。

    我正在发布我在不同位置实例化玩家的整个工作流程:

    首先检查我们是否是主客户端:

    然后获取玩家列表并在位置上分别向每个人发送 rpc 以生成它们。您可以存储一个位置数组并在 rpc 中发送索引。

    代码如下:

    photonView = PhotonView.Get(this);
        if(PhotonNetwork.IsMasterClient)
        {
            foreach(Player pl in PhotonNetwork.PlayerList)
            {
                //Debug.Log(pl);
                photonView.RPC("InstantiationPlayer",pl,index);
               
                index++;
            }
        }
    
     [PunRPC]
        void InstantiationPlayer(int index)
        {
            
    

    PhotonNetwork.Instantiate(Playerprefabs[value].name,SpawnPoints[index].transform.position, Quaternion.identity, 0); }

    谢谢。

    【讨论】:

      猜你喜欢
      • 2017-03-09
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      相关资源
      最近更新 更多