C# 我应该旋转炮塔的哪个部分来面对目标?以什么速度?

C# 我应该旋转炮塔的哪个部分来面对目标?以什么速度?,c#,unity3d,C#,Unity3d,旋转转台的代码很简单: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Rotateturret : MonoBehaviour { public Transform target; public Transform partToRotate; public float turnSpeed = 10f; private voi

旋转转台的代码很简单:

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如果我将它附加到炮塔子部件,它将旋转并查看目标。喜欢看。 这是转台部分的屏幕截图:

如果我将脚本附加到挂架部分,它将缓慢旋转,并始终保持在目标后面,但旋转速度不够快

塔架部分的屏幕截图:

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

第二,我应该如何计算炮塔的旋转速度?它是否总是应该面对完美的目标?或者有时,如果目标以随机速度移动,炮塔不会一直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?我想这个剧本也没有太多的逻辑


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

首先,请注意,从您的屏幕截图中,
挂架
游戏对象的
前进方向
(蓝色箭头)垂直于炮塔炮筒的方向。因此,将脚本附加到该游戏对象上不会产生所需的行为

当涉及到炮塔移动的实现时,它在很大程度上取决于游戏的上下文

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


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

首先,有一个LookRotation重载,它将轴作为第二个参数,因此如果您尝试

 Quaternion lookRotation = Quaternion.LookRotation(dir,Vector3.up);
旋转将始终围绕垂直轴进行。通过这种方式,您可以像使用机械设备一样将运动拆分为单独的轴(即,塔架仅绕垂直轴旋转)

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

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

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

PID代表比例、积分和微分,根据这三种查看值的方式计算执行器输出(即驱动旋转的力)。
在最简单的形式中,它是这样工作的:比例是你的直接增量-你离目标角度(或目标前进点)的角度有多大。这是你不可分割的一部分,它将以更慢的方式跟随目标。现在,如果你从你的当前(比例)值中减去你的平均(综合)值,你会得到一些代表你的变化的东西,这可以作为一个指示成分。现在,这最后一部分是当目标改变轨迹时,旋转的反应,你可以使输出超过变化,或者以多种其他方式调整它

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