Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vector 团结-让摄像机锁定敌人并留在玩家身后?_Vector_Unity3d - Fatal编程技术网

Vector 团结-让摄像机锁定敌人并留在玩家身后?

Vector 团结-让摄像机锁定敌人并留在玩家身后?,vector,unity3d,Vector,Unity3d,我试图创建一个相机,它可以随着玩家移动,但当玩家点击锁定按钮时,它会锁定敌人。这种行为几乎像我想要的那样工作,相机锁定在目标上。当玩家站在目标面前时,效果很好。然而,当玩家跑过目标时,相机的行为会很奇怪。它仍然注视着敌人,但是它不会呆在玩家身后。以下是指示行为的代码: if(MouseLock.MouseLocked && !lockedOn){ // MOUSE CONTROL: Data.Azimuth += Input.GetAxis("Mouse X") * Or

我试图创建一个相机,它可以随着玩家移动,但当玩家点击锁定按钮时,它会锁定敌人。这种行为几乎像我想要的那样工作,相机锁定在目标上。当玩家站在目标面前时,效果很好。然而,当玩家跑过目标时,相机的行为会很奇怪。它仍然注视着敌人,但是它不会呆在玩家身后。以下是指示行为的代码:

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

正如我所说的,行为几乎如预期的那样工作,但是我需要摄像机在锁定时留在玩家身后,并且必须面对敌人/敌人和玩家之间的中点。如何做到这一点?感谢您的时间。

为了澄清您的意图:您想锁定相对于目标玩家的位置,同时设置摄像机旋转以查看目标或次要目标敌人?您当前的代码正确执行旋转,但定位有问题

相对于另一个对象固定摄影机的最简单方法是在场景中将其设置为父对象。在您的情况下,可以将相机作为子对象添加到玩家游戏对象下

如果您不想这样做,请再次查看定位代码:

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;
}
这将固定定位。将跟车距离和跟车高度设置为您想要的值。假设您的旋转代码工作,这应该可以解决问题