Кватернион

Я пытаюсь следовать нескольким примерам unity3d в сценариях С# для игр в стиле Tower Defense. Мне нужна турель, чтобы «прицеливаться» в другой игровой объект. Примеры, которые я нахожу, похоже, не учитывают происхождение, отличное от 0,0,0. Это означает, что когда турель находится в другом месте, она нацеливается на начальную точку, а не на текущее местоположение.

как он ведет себя сейчас: http://screencast.com/t/Vx35LJXRKNUm

Как в сценарии, который я использую, предоставить Quaternion.LookRotation информацию о текущем местоположении башни, чтобы она включалась в ее расчет? скрипт, функция CalculateAimPosition, строка 59:

using UnityEngine;
using System.Collections;

public class TurretBehavior : MonoBehaviour {

public GameObject projectile;
public GameObject muzzleEffect;

public float reloadTime = 1f;
public float turnSpeed = 5f;
public float firePauseTime = .25f;

public Transform target;
public Transform[] muzzlePositions;
public Transform turretBall;

private float nextFireTime;
private float nextMoveTime;
private Quaternion desiredRotation;
private Vector3 aimPoint;

// Update is called once per frame
void Update () 
{
    if (target) 
    {
        if (Time.time >= nextMoveTime) 
        {
            CalculateAimPosition(target.position);
            transform.rotation = Quaternion.Lerp(turretBall.rotation, desiredRotation, Time.deltaTime * turnSpeed);     
        }   

        if (Time.time >= nextFireTime) {
            FireProjectile();
        }
    }
}

void OnTriggerEnter(Collider other)
{
    if (other.gameObject.tag == "TurretEnemy") 
    {
        nextFireTime = Time.time +(reloadTime *.5f);
        target = other.gameObject.transform;
            }

}

void OnTriggerExit(Collider other)
{
    if (other.gameObject.transform == target) {
        target = null;
            }
}

void CalculateAimPosition(Vector3 targetPosition)
{
    aimPoint = new Vector3 (targetPosition.x, targetPosition.y, targetPosition.z);
    desiredRotation = Quaternion.LookRotation (aimPoint);
}

void FireProjectile()
{
    nextFireTime = Time.time + reloadTime;
    nextMoveTime = Time.time + firePauseTime;

    foreach(Transform transform in muzzlePositions)
    {
        Instantiate(projectile, transform.position, transform.rotation);
    }
}
}

person Roger    schedule 01.01.2015    source источник


Ответы (1)


Ошибка заключается в использовании Quaternion.LookRotation.

Функция принимает два Vector3 в качестве входных данных, которые являются прямым направлением в мировом пространстве (и необязательный вектор вверх - по умолчанию Vector3.up), и возвращает Quaternion, представляющий ориентацию такой системы отсчета.

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

Что вам нужно использовать в качестве параметра LookRotation, так это направление в мировом пространстве от башни к цели:

Vector3 aimDir = (targetPosition - transform.position).normalized;
desiredRotation = Quaternion.LookRotation (aimDir );
person Heisenbug    schedule 01.01.2015
comment
Спасибо. Это очень четкий ответ. Говоря о внимании к деталям, вы даже отредактировали ссылку на номер строки, когда редактировали мой код. Спасибо - person Roger; 02.01.2015