首页 > 解决方案 > 我应该旋转炮塔的哪个部分来面对目标?以什么速度?

问题描述

旋转炮塔的代码很简单:

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 附加到 Turret 子部件,它将旋转并查看目标。就像做 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?我猜这个脚本中也没有太多逻辑。

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

标签: c#unity3d

解决方案


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

当谈到炮塔移动的实现时,很大程度上取决于你的游戏环境

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

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


推荐阅读