2015-01-01 8 views
2

나는 타워 방어 스타일 게임을위한 C# 스크립팅에서 몇 가지 unity3d exmaples을 따르려고합니다. 다른 게임 개체를 목표로 포탑이 필요합니다. 내가 찾은 예제는 0,0,0에없는 원점을 설명하지 않는 것 같습니다. 의미, 터렛이 다른 위치에있을 때, 현재 위치가 아닌 시작점을 기준으로합니다.Quaternion LookRotation

어떻게 지금 작동하고 : 내가 사용하고있는 스크립트에서 http://screencast.com/t/Vx35LJXRKNUm

, 어떻게 그것을 계산의에 포함하기 위해 포탑의 현재 위치에 대한 Quaternion.LookRotation 정보를 제공합니까? 스크립트 기능 CalculateAimPosition, line59 :

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); 
    } 
} 
} 

답변

4

오류는 Quaternion.LookRotation의 사용에있다.

이 함수는 월드 공간에서 순방향 인 두 개의 입력 (그리고 선택적인 상향 벡터 - 기본값 : Vector3.up)을 입력 받아 해당 참조 프레임의 방향을 나타내는 Quaternion을 반환합니다.

대신 입력으로 세계 공간 위치를 제공합니다 (targetPosition). 이는 의미가 없습니다. 우연히 세계 공간에서 표현 된 정규화 된 위치 벡터는 원점에서 주어진 점까지의 방향이므로 타워가 원점에있을 때 올바르게 작동합니다.

당신이 LookRotation 매개 변수가 목표로 타워에서 세계 공간 방향으로 사용할 필요가있는 무엇 :

Vector3 aimDir = (targetPosition - transform.position).normalized; 
desiredRotation = Quaternion.LookRotation (aimDir); 
+0

감사합니다가. 이는 매우 분명한 답변입니다. 세부 사항에 대한 관심에 대해 이야기하고 코드를 편집 할 때 줄 번호에 대한 참조를 편집했습니다. 감사 – Roger

관련 문제