首页 > 解决方案 > 如果目标足够近,如何使炮塔面向目标旋转并使目标以随机高度和速度围绕炮塔旋转?

问题描述

目标是一个简单的 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;
        }
    }
}

运行游戏时,立方体没有移动,炮塔也没有移动。只有当我在场景视图窗口中移动目标立方体时,才拖动它,然后炮塔旋转,而且炮塔有点落后,从不面对目标立方体。

我需要它做的是在运行游戏时,立方体将开始以随机速度围绕炮塔不停地循环,并且目标立方体也应该以最小/最大高度之间的随机高度向下移动。

并且炮塔应根据目标高度和速度面向目标旋转。

标签: c#unity3d

解决方案


使一个空的游戏对象与炮塔相同的位置,然后使该空对象的目标子对象并将其放置到要旋转它的位置,然后使用该 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);
}

推荐阅读