インターネットでの方法に関係なく、戦車砲塔の照準システムを構築する
必要がありますが、最終的には完全に完成していないことを直接認めます。バレルはまだ私の考えどおりに動作しません。しかし、それは形になります。効果の後、
砲塔は続きますが、バレルにはまだ独自のアイデアがあります
コードに直接移動します。原則についてコメントしたいのですが、ほとんど言っています。ここに砲塔を置きましょう。
// 用于存储瞄准的方向
Vector3 aimPosition = Vector3.zero;
// 用于确定射线的落点
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
float distance;
Plane plane = new Plane(Vector3.up, raycastTarget.position);
if (plane.Raycast(ray, out distance))
{
aimPosition = ray.origin + ray.direction * distance;
}
// 炮塔的实际旋转
Vector3 turretPos = aimPosition;
turretPos.y = turret.position.y; //过滤掉y轴的信息,防止炮塔出现绕x,z轴旋转的问题
Quaternion aimRotTurret = Quaternion.RotateTowards(turret.rotation,
Quaternion.LookRotation(turretPos - turret.position, Vector3.up), Time.deltaTime * rotateSpeed);
turret.rotation = aimRotTurret;
コア部分は、Quaternion.RotateTowardsメソッドを使用して、タレットがゆっくりと回転する効果を実現することです。このメソッドは、単純にカスタマイズされています。必要なパラメータは、初期回転(タレットの位置)、ターゲット回転、および回転速度です。次に、彼の戻り値を取得し、フレームごとにタレットの回転に割り当てます。インターネットを見ると、この方法はlerpに似ているはずだと言われていますが、とにかく少し混乱しています(ただ動作します)。
次に、ターゲットの回転を決定する必要があるもう1つの重要な問題があります。まず、カメラの前面に沿って放射される光線を通過させ、常にカメラの前面にある光線を当てると、位置が常に保証されます。タレットの前(カメラはタレットの前にあります))平面、Vector3 aimPositionを取得するには、これがaimPositionバレルの位置合わせ位置であり、タレットの隣にあり、影響aimPositionがY-からフィルターで除外されます。軸、そうでなければスイングタレットタレット
タレットになりますそうは言っても、これまでのところかなり成功していると思いますが、バレルはそれほど滑らかではありません。私の考えでは、バレルはまだaimPositionですが、xとz軸は除外されます。しかし、状況は非常に不十分です。バレルはタレットの一部です。タレット回転ガンの管理は回転に従う必要があります。無視すると、タレットは逃げ出し、バレルはまだ所定の位置に固定されています。無視しない場合、砲身は砲塔より1歩早く戻ります。現状は説明できない状態です。。。たぶんそれは0が間違っているからです。今、少し遅れて、明日やりましょう。
// 炮管的实际旋转(有问题)
Vector3 gunPos = aimPosition;
gunPos.x = 0;
gunPos.z = 0; //类似的过滤操作
Quaternion aimRotGun = Quaternion.RotateTowards(gun.rotation,
Quaternion.LookRotation(gunPos - gun.position, Vector3.up), Time.deltaTime * rotateSpeed);
gun.rotation = aimRotGun;
その夜、バレル回転の問題は解決されました。以下の方法:
// 炮管的实际旋转(BUG已经修好)
Vector3 gunPos = aimPosition;
Quaternion aimRotGun = Quaternion.RotateTowards(gun.rotation,
Quaternion.LookRotation(gunPos - gun.position), Time.deltaTime * rotateSpeed);
// 让localRotation的y,z轴不要转
gun.localRotation = Quaternion.Euler(aimRotGun.eulerAngles.x, 0f, 0f);
この方法は、gun.localRotationへの割り当ての最後に何かを実行することです。aimRotGun.eulerAngles.xは使用する回転軸であり、y軸とz軸は直接0に設定されます。