как посмотреть (нацелиться) на сборный проект в Unity 2d - PullRequest
0 голосов
/ 30 августа 2018

Я хочу прицелиться 2d префабов (они появляются случайным образом). Я хочу нацелить ближайший сборный, который приближается к моему объекту.

Это не работает:

 Vector2 direction = target.position - transform.position;
 float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
 Quaternion rotation = Quaternion.AngleAxis(angle, Vector3.forward);
 transform.rotation = Quaternion.Slerp(transform.rotation, rotation, 
                                       speed * Time.deltaTime);

есть идеи?

this is full code

Here is what i want

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вот решение, которое должно помочь вам начать.
Всякий раз, когда вы Instantiate цель, добавьте ее в список. Давайте назовем это allTargets (убедитесь, что добавили экземпляр объекта, а не префаб). Теперь единственное, что вам нужно сделать, это найти ближайший target в этом списке.

public List<Transform> allTargets;

void Start()
{
    allTargets = new List<Transform>();
}

void Update () {
    Transform closestTarget = GetClosestTarget(allTargets);        
    Quaternion targetRotation = GetRotationTo(closestTarget);
    transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, speed * Time.deltaTime);
}

Quaternion GetRotationTo(Transform target)
{
    Vector3 dir = target.position - transform.position;
    float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
    return Quaternion.AngleAxis(angle, Vector3.forward);
}

Transform GetClosestTarget(List<Transform> targets)
{              
    Transform closest = null;

    float minDistance = float.MaxValue;
    foreach (var t in targets)
    {
        float distance = Vector2.Distance(t.position, transform.position);
        if(distance < minDistance)
        {
            minDistance = distance;
            closest = t;
        }
    }
    return closest;
}
0 голосов
/ 31 августа 2018

Я предполагаю, что вы можете найти ближайший игровой объект и установить его в target.position. Теперь измените ваш скрипт на это:

void Update () 
{
    Vector2 direction = target.position - transform.position;
    float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
    Quaternion newQuaternion = Quaternion.Euler(new Vector3(0, 0, angle));
    transform.rotation = Quaternion.Slerp(transform.rotation, newQuaternion, speed * Time.deltaTime);
}

Обратите внимание, что: Ваш игровой объект, который нацелен на префабы, должен смотреть на правую ось X при повороте в (0,0,0) (как на изображении)

enter image description here

Надеюсь, это поможет вам

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