2015-04-05 136 views
0

我正在尝试创建一个随播放器一起移动但在播放器单击按钮上的锁时锁定到敌人的摄像头。该行为几乎按照我的意愿工作,相机锁定在目标上。当玩家站在目标的前面时,它可以正常工作。然而,只要玩家跑过目标,相机的行为就会很奇怪。它仍然看着敌人,但它不会留在玩家后面。下面是决定行为的代码:Unity - 让相机锁定在敌人身后并留在玩家身后?

if(MouseLock.MouseLocked && !lockedOn){ // MOUSE CONTROL: 
    Data.Azimuth += Input.GetAxis("Mouse X") * OrbitSpeed.x; 
    Data.Zenith += Input.GetAxis("Mouse Y") * OrbitSpeed.y; 
} else if(lockedOn) { // LOCKON BEHAVIOUR: 
    FindClosestEnemy(); 
} 

if (Target != null) { 
    lookAt += Target.transform.position; 
    base.Update(); 
    gameObject.transform.position += lookAt; 
if(!lockedOn){ 
    gameObject.transform.LookAt (lookAt); 
} else if(enemyTarget != null) { 
    Vector3 pos1 = Target.transform.position ; 
    Vector3 pos2 = enemyTarget.transform.position ; 
    Vector3 dir = (pos2 - pos1).normalized ; 
    Vector3 perpDir = Vector3.Cross(dir, Vector3.right) ; 
    Vector3 midPoint = (pos1 + pos2)/2f; 
    gameObject.transform.LookAt (midPoint); 
} 

} 

,代码为查找最近的敌人:

void FindClosestEnemy() { 
    int numEnemies = 0; 
    var hitColliders = Physics.OverlapSphere(transform.position, lockOnRange); 
    foreach (var hit in hitColliders) { 
     if (!hit || hit.gameObject == this.gameObject || hit.gameObject.tag == this.gameObject.tag){ 
      continue; 
     } 
     if(hit.tag != "Enemy") // IF NOT AN ENEMY: DONT LOCK ON 
      continue; 
     var relativePoint = Camera.main.transform.InverseTransformPoint(hit.transform.position); 
     if(relativePoint.z < 0){ 
      continue; 
     } 
     numEnemies += 1; 
     if(enemyTarget == null){ 
      print ("TARGET FOUND"); 
      enemyTarget = hit; 
     } 
    } 
    if(numEnemies < 1){ 
     lockedOn = false; 
     enemyTarget = null; 
    } 
} 

正如我所说,德行为几乎正常工作,但我需要将相机留在玩家身后锁定,并且必须面对敌人和玩家之间的敌人/中点。如何才能做到这一点?感谢您的时间。

回答

1

要阐明你的意图:要相对于目标(玩家)的位置锁定,同时设置相机的旋转来看待任何目标或次要目标(敌人)?您的当前代码正确执行旋转,但定位错误?

相对于另一对象的相机解决最简单的方法就是父母它在场景中。在你的情况下,你可以添加相机作为播放器游戏对象下的孩子。

如果你宁愿不这样做,那么你的定位代码再看看:

lookAt += Target.transform.position; 
base.Update(); 
gameObject.transform.position += lookAt; 

我不知道在哪里lookAt来自原先但对我来说,这看起来完全错误的。一些所谓的lookAt应该有无关的位置,我怀疑你想在定位代码+=东西给你想要一个固定的相对位置。试试这个:

public float followDistance; // class instance variable = distance back from target 
public float followHeight; // class instance variable = camera height 
... 
if (Target != null) { 
    Vector3 newPos = target.position + (-Target.transform.forward * followDistance); 
    newPos.y += followHeight; 
    transform.position = newPos; 
} 

这应该修复定位。设置followDistance并跟随高度到任何你想要的。假设你的轮换代码工作,这应该解决这个问题。