Фотон определяет, находится ли игрок уже в этой точке возрождения

У меня есть 3 игрока в комнате и 3 установленных позиции появления, но я бы хотел, чтобы каждый игрок появлялся в одной из этих позиций, а не в одной и той же позиции. У меня есть это, но как я могу убедиться, что другой игрок также не появится в этой точке возрождения?

number = UnityEngine.Random.Range(1, 3);


if (number == 1)
{    
     spawnpoint = GameObject.FindWithTag("spawnpoint1");
}


if (number == 2)
{
     spawnpoint = GameObject.FindWithTag("spawnpoint2");
}

if (number == 3)
{
     spawnpoint = GameObject.FindWithTag("spawnpoint3");
}

GameObject myPlayer = PhotonNetwork.Instantiate(playerprefabname, spawnpoint.transform.position, spawnpoint.transform.rotation, 0);

person ziggy    schedule 21.10.2015    source источник
comment
Вы можете добавить все 3 точки возрождения в набор и перетасовать набор. Затем переберите набор, порождающий ваших игроков. Это даст вам случайный набор уникальных точек возрождения. Если вы не используете один и тот же элемент дважды, это должно дать каждому игроку уникальную точку возрождения.   -  person Clark Kent    schedule 21.10.2015


Ответы (3)


Поместите список доступных позиций возрождения в стек; когда вам нужна новая позиция, вытащите элемент из стека и используйте эту позицию появления.

Вы должны убедиться, что у вас больше позиций возрождения, чем у игроков — это очевидно.

И вы также, вероятно, хотите каждый раз как-то рандомизировать стек.

Вы можете взять эту концепцию и использовать любую структуру данных, которую хотите, но важная идея состоит в том, чтобы удалить «потребляемый» элемент, пока вы не будете готовы к сбросу.

person Frank V    schedule 21.10.2015
comment
Спасибо, надо будет придумать как это сделать :P - person ziggy; 21.10.2015

Вы можете создать массив точек появления, рандомизировать их и создать там свой объект. С помощью этого метода вы можете иметь столько точек возрождения, сколько хотите, без необходимости изменять код.

using UnityEngine;
using System.Linq;

public class Test : MonoBehaviour {

    [SerializeField] Vector3[] spawnPoints;
    [SerializeField] GameObject spawnObject;


    void Start(){
        InitRandom ();
    }

    void InitRandom(){
        System.Random rnd = new System.Random ();
        Vector3[] items = (
            from i in spawnPoints
            orderby rnd.Next()
            select i
        ).ToArray();

        foreach (Vector3 v in items) {
            Instantiate(spawnObject, v, Quaternion.identity);
        }
    }
}
person Get Off My Lawn    schedule 22.10.2015

Вы можете попробовать получить количество игроков, подключенных к комнате, и использовать это число для выбора конкретной точки возрождения.

Что-то вроде этого -

var playerID = PhotonNetwork.otherPlayers.Length;
var player = PhotonNetwork.Instantiate(name, spawns[playerID].transform.position, spawns[playerID].transform.rotation, 0);
player.name = "Player " + (playerID + 1);
person mutp    schedule 10.04.2018