c# - 我应该旋转炮塔的哪个部分来面对目标?以什么速度?
问题描述
旋转炮塔的代码很简单:
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?我猜这个脚本中也没有太多逻辑。
另一件事是,将来我还想旋转枪来发射子弹。所以射速和何时开始射击是另一个问题,也许这将是另一个问题,但我猜射击子弹也与炮塔旋转逻辑有关。
解决方案
首先,请注意,从您的屏幕截图中,Pylon
游戏对象forward direction
(蓝色箭头)垂直于炮塔枪管的方向。因此,将脚本附加到该游戏对象上不会产生您想要的行为。
当谈到炮塔移动的实现时,很大程度上取决于你的游戏环境。
例如,如果炮塔要用于塔防游戏中,它不会错过,那么通常炮塔的旋转和射击动画应该只是一个效果。您对目标造成的实际伤害将直接通过脚本完成(例如,在范围内搜索可行的目标并发送 onShoot 事件)。在这种情况下,atransform.lookAt()
就足够了,因为它会产生合理的视觉效果。
但是,如果您的炮塔要在First Player Shooter游戏中使用,那么它的旋转将由玩家控制(通过变换或刚体物理)。炮塔是否应该对敌人造成伤害取决于弹丸(通过刚体和对撞机的物理模拟)是否击中敌人。在这种情况下,您必须限制炮塔的最大旋转速度。阈值的多少取决于您希望它有多现实。
推荐阅读
- sql - 密码不应包含用户名的三个或更多连续字符
- elasticsearch - 如何在 ElasticSearch Java API 中添加多个字段以对热门内容进行排序?
- javascript - 在 zip 文件中打开 zip 文件
- html - 如何将谷歌表格文档中单个单元格的文本数据添加到要在网站上显示的 html 中?
- r - 是否有更有效的方法在数据框中生成频率列
- c - 如何编写在 Windows 上运行的 c 代码?
- python - 将数据框保存到新目录中的新 csv 文件
- rxjs - 以异步方式处理管道中的数据
- python - 如何基于 .csv 文件创建多个 .md 文件,并将 .csv 文件的正确行输入到每个新创建的 .md 文件中?
- json - JSON 不会验证