【问题标题】:What part of the turret should I rotate to face the target ? And at what speed?我应该旋转炮塔的哪个部分来面对目标?以什么速度?
【发布时间】:2018-06-05 03:45:05
【问题描述】:

旋转炮塔的代码很简单:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rotateturret : MonoBehaviour
{
    public Transform target;
    public Transform partToRotate;
    public float turnSpeed = 10f;

    private void Update()
    {
        transform.LookAt(target);
    }
}

本例中的目标是以固定速度绕炮塔旋转,但高度随机变化。

如果我将此脚本 RotateTurret 附加到炮塔子部件,它将旋转并查看目标。就像做 LookAt。 这是炮塔部分的截图:

如果我将脚本附加到 Pylon 部分,它会缓慢旋转并始终停留在目标后面,旋转速度不够快。

Pylon 部分截图:

我的问题是:我应该旋转炮塔的哪个部分?逻辑上说的是我认为的 Pylon。

其次我应该如何计算炮塔应该旋转的速度?它总是要面对完美的目标吗?或者有时如果目标以随机速度移动,炮塔不会一直 100% 面对它?这种情况下的逻辑是什么?仅使用 LookAt 是不够的。而且我还没有使用物理学,这是我猜的另一个问题。如果炮塔和目标都使用物理,但现在不确定如何进行炮塔逻辑(或者我应该称之为 AI)。

为了测试,我也尝试了这个脚本:

public class Rotateturret : MonoBehaviour
{
    public Transform target;
    public Transform partToRotate;
    public float turnSpeed = 10f;

    private void Update()
    {
        Debug.DrawRay(transform.position, transform.forward, Color.green, 1000);
        Vector3 dir = target.position - transform.position;
        Quaternion lookRotation = Quaternion.LookRotation(dir);
        Vector3 rotation = Quaternion.Lerp(partToRotate.rotation, lookRotation, Time.deltaTime * turnSpeed).eulerAngles;
        partToRotate.rotation = Quaternion.Euler(0f, rotation.y, 0f);
    }
}

再一次,如果我旋转炮塔,它会更准确,但如果是塔,它会在目标后面。谁说炮塔的旋转速度应该是10和20或50或1?我猜这个脚本也没有太多逻辑。

另一件事是,将来我还想旋转枪来发射子弹。所以开火率和开火时间是另一个问题,也许这将是另一个问题,但我猜射击子弹也与炮塔旋转逻辑有关。

【问题讨论】:

  • 您旋转炮塔的速度取决于您希望炮塔跟踪目标的速度。这是一个设计选择。 (假设你正在制作一款游戏,因为它是 Unity)
  • @AndrewFan 我想做一个跟踪系统逻辑。但即使在游戏中,例如塔防,炮塔总是 100% 锁定目标并在射击时总是击中目标?是不是应该更逼真,这样目标会尝试通过随机改变速度来避免命中,然后炮塔有时会错过目标?只是让它看着并自动射击目标似乎有点无聊。

标签: c# unity3d


【解决方案1】:

首先,请注意,从您的屏幕截图中,Pylon 游戏对象的forward direction(蓝色箭头)垂直于炮塔枪管的方向。因此,将脚本附加到该游戏对象上不会产生您想要的行为。

关于炮塔移动的实现,很大程度上取决于游戏的上下文

例如,如果炮塔用于塔防游戏中,并且它不会错过,那么通常炮塔的旋转和射击动画应该只是一个效果。您对目标造成的实际伤害将直接通过脚本完成(例如在范围内搜索可行的目标并发送 onShoot 事件)。在这种情况下,transform.lookAt() 就足够了,因为它会产生合理的视觉效果。

但是,如果您的炮塔用于First Player Shooter 游戏,那么它的旋转将由玩家控制(通过变换或刚体物理)。炮塔是否应该对敌人造成伤害取决于弹丸(通过physics用刚体和对撞机模拟)是否击中敌人。在这种情况下,您必须限制炮塔的最大旋转速度。阈值的多少取决于您希望它有多现实。

【讨论】:

    【解决方案2】:

    首先,有一个 LookRotation 重载,它将轴作为第二个参数,所以如果你尝试

     Quaternion lookRotation = Quaternion.LookRotation(dir,Vector3.up);
    

    旋转将始终围绕垂直轴。通过这种方式,您可以像使用机械设备一样将运动拆分为单独的轴(即塔只围绕垂直轴旋转)

    至于第二部分,即如何使炮塔击中目标,您可以采取以下几种方法:

    例如,您可以获取炮塔和目标之间的距离,将子弹速度除以目标速度,然后将 target.transform.forward 乘以该比率和距离(这是从头部计算的,但您明白了)。

    一个更有趣的选择是借此机会了解 PID 控制器,炮塔是一个很好的例子,说明你可以用一个非常简单的控制器做多少事情。

    PID 代表比例、积分和微分,您可以根据这三种查看值的方式计算执行器输出(即驱动旋转的力)。 在最简化的形式中,它的工作原理是这样的:比例是您的直接增量 - 您距目标角度(或距目标前进点)的角度。比您将该参数平均化(即,将当前值调整到目标值或使用移动平均线)显着量,这是您不可或缺的部分 - 它将以更慢的方式跟随目标。现在,如果您从当前(比例)值中减去平均(综合)值,您会得到代表您的变化的东西,这可以用作衍生成分。现在这最后一部分是当目标改变轨迹时使炮台做出反应的原因,您可以使输出超过变化,或以多种其他方式调整它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多