как я могу показать, откуда идет враг? - PullRequest
0 голосов
/ 24 января 2019

я играю в автомобильный раннер (все объекты в 3d), где полицейские преследуют игрока я порождаю копов из 4 разных мест (то есть слева, справа, сверху, снизу)

private int lastSpawnPos;
[SerializeField]
private Transform[] spawnPos;

void SpawnPoliceCar()
    {
        GameObject policeCar = ObjectPooling.instance.GetPooledObject("PoliceCar");
        int r = UnityEngine.Random.Range(0, spawnPos.Length);

        while (lastSpawnPos == r)
        {
            r = UnityEngine.Random.Range(0, spawnPos.Length);
        }
        Vector3 policeCarPos = policeCar.transform.position;
        policeCarPos = new Vector3(spawnPos[r].position.x, 0, spawnPos[r].position.z);
        policeCar.SetActive(true);
        policeCar.GetComponent<Damage>().DefaultSetting();
        lastSpawnPos = r;
        currentPoliceCar++;
    }

я вызываю этот метод в update (), и этот скрипт применяется к пустому игровому объекту на сцене. Так как этот код прекрасно работает
но теперь я хотел добавить стрелку на экране, где появляются полицейские, а также вращать стрелку в соответствии с направлением. я порождаю 4 копа за раз.
Может ли кто-нибудь 1 помочь мне в этом, пожалуйста, я новичок в этой платформе и застрял здесь в течение длительного времени

1 Ответ

0 голосов
/ 24 января 2019

Когда вы порождаете копов, вы можете хранить их в List<Transform> копах и удалять их (если это поддерживается для уничтожения или удаления копов из игры). Таким образом, у вас будет позиция игрока и все позиции полицейских.

Используя эти данные, вы можете найти расстояние от полицейского до игрока, используя Vector3.Distance или Vector2.Distance (если вы хотите игнорировать координату z игрока и полицейских ). Используя эти методы, вы можете зациклить список полицейских и найти ближайшего / самого дальнего полицейского от игрока (если вы хотите показать не любого полицейского, но самого близкого - самого последнего порожденного или ближайшего).

После того, как вы нашли полицейский игровой объект, на который указывает стрелка, вы можете повернуть стрелку к этому игровому объекту, используя метод Transform.LookAt . Вызывайте этот метод при каждом вызове Update(), и вращение вашей стрелки будет следовать выбранному копу.

Обновление : Для самого дальнего полицейского ваш код может выглядеть так:

private int lastSpawnPos;
[SerializeField]
private Transform[] spawnPos;

//Your arrow 
public GameObject Arrow;
//Player
public Transform Player;
//Storing all spawned cops
public List<Transform> Cops;

void SpawnPoliceCar()
{
    GameObject policeCar = ObjectPooling.instance.GetPooledObject("PoliceCar");
    int r = UnityEngine.Random.Range(0, spawnPos.Length);
    //Adding cop to the list when spawned
    //TODO: do not forget to remove from the list, when cop is removed (back to the pool)
    Cops.Add(policeCar.transform);

    while (lastSpawnPos == r)
    {
        r = UnityEngine.Random.Range(0, spawnPos.Length);
    }
    Vector3 policeCarPos = policeCar.transform.position;
    policeCarPos = new Vector3(spawnPos[r].position.x, 0, spawnPos[r].position.z);
    policeCar.SetActive(true);
    policeCar.GetComponent<Damage>().DefaultSetting();
    lastSpawnPos = r;
    currentPoliceCar++; 
}

//Call this on update
void PointArrow()
{
    Transform farthestCop = null;
    float maxDistance = 0.0f;
    //Find the farthes cop
    foreach (var cop in Cops)
    {
        var distance = Vector3.Distance(Player.position, cop.position);
        if (distance > maxDistance)
        {
            farthestCop = cop;
            maxDistance = distance;
        }
    }
    //If there are no cops - can't point an arrow
    if(farthestCop == null) return;
    //Point an arrow on the cop
    Arrow.transform.LookAt(farthestCop);
}

Я не могу точно сказать, что это то, что вы ищете, не зная полную игру и код. Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...