【问题标题】:Unity - Making Camera Lock on To Enemy and stay behind player?Unity - 让相机锁定敌人并留在玩家身后?
【发布时间】:2015-04-05 14:24:15
【问题描述】:

我正在尝试创建一个与玩家一起移动但在玩家单击锁定按钮时锁定敌人的摄像机。该行为几乎可以按我的意愿工作,相机锁定在目标上。当玩家站在目标前面时,它可以正常工作。然而,一旦玩家跑过目标,相机就会出现奇怪的行为。它仍然注视着敌人,但它并没有留在玩家身后。这是指示行为的代码:

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

正如我所说,这些行为几乎可以按预期进行,但是我需要相机在锁定时保持在玩家身后,并且它必须面向敌人和玩家之间的敌人/中点。如何才能做到这一点?感谢您的宝贵时间。

【问题讨论】:

    标签: vector unity3d


    【解决方案1】:

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

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

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

    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 和 followHeight 设置为您想要的任何值。假设您的轮换代码有效,这应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多