c# - 如果目标足够近,如何使炮塔面向目标旋转并使目标以随机高度和速度围绕炮塔旋转?
问题描述
目标是一个简单的 3d 立方体。
此屏幕截图显示了层次结构中的炮塔以及附加到它的脚本和目标。
该脚本附加到 Turret child :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotateTurret : MonoBehaviour
{
[SerializeField]
private float turnRateRadians = 2 * Mathf.PI;
[SerializeField]
private Transform turretTop; // the gun part that rotates
[SerializeField]
private Transform bulletSpawnPoint;
//private Enemy target;
public GameObject target;
void Update()
{
TargetEnemy();
}
void TargetEnemy()
{
if (target != null)
{
Vector3 targetDir = target.transform.position - transform.position;
// Rotating in 2D Plane...
targetDir.y = 0.0f;
targetDir = targetDir.normalized;
Vector3 currentDir = turretTop.forward;
currentDir = Vector3.RotateTowards(currentDir, targetDir, turnRateRadians * Time.deltaTime, 1.0f);
Quaternion qDir = new Quaternion();
qDir.SetLookRotation(currentDir, Vector3.up);
turretTop.rotation = qDir;
}
}
}
运行游戏时,立方体没有移动,炮塔也没有移动。只有当我在场景视图窗口中移动目标立方体时,才拖动它,然后炮塔旋转,而且炮塔有点落后,从不面对目标立方体。
我需要它做的是在运行游戏时,立方体将开始以随机速度围绕炮塔不停地循环,并且目标立方体也应该以最小/最大高度之间的随机高度向下移动。
并且炮塔应根据目标高度和速度面向目标旋转。
解决方案
使一个空的游戏对象与炮塔相同的位置,然后使该空对象的目标子对象并将其放置到要旋转它的位置,然后使用该 sciprt 旋转空的父对象
private int _minY, _maxY;
private int _targetHeight;
private const float Tolerance = 0.1f;
private void Start()
{
_minY = -10;
_maxY = 10;
_targetHeight = Random.Range(_minY, _maxY);
}
private void FixedUpdate()
{
var randomSpeed = Random.Range(2, 4);
transform.Rotate(0,randomSpeed,0);
if(Math.Abs(transform.position.y - _targetHeight) < Tolerance)
_targetHeight = Random.Range(_minY, _maxY);
transform.position = Vector3.MoveTowards(transform.position, new Vector3(transform.position.x, _targetHeight, transform.position.z), randomSpeed/10f);
}