炮塔子弹跟随玩家



目前,我的炮塔子弹跟随我的玩家。如何阻止它并使其仅向前移动我的玩家的最后一个位置?这是我目前的代码:

炮塔子弹类:

using UnityEngine;
using System.Collections;
public class TurretBullet : MonoBehaviour {
    private Transform target;
    public float speed = 70f;
    public void Seek(Transform _target) {
        target = _target;
    }
    void Update() {
        if (target == null) {
            Destroy(gameObject);
            return;
        }
        float distanceThisFrame = speed * Time.deltaTime;
        Vector3 dir = target.position - transform.position;

        if(dir.magnitude <= distanceThisFrame) {
            HitTarget();
            return;
        }
        transform.Translate(dir.normalized * distanceThisFrame, Space.World);
    }
    void HitTarget() {
        Debug.Log("Player Hit!");
        Destroy(gameObject);
    }
}

我在尝试实验Vector3.forward看到了需要使用的地方,但我无法使其工作。如何正确实现它?

炮塔等级:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Turret : MonoBehaviour {
    private Transform target;
    [Header("Attributes")]
    public float range = 15f;
    public float fireRate = 1f;
    private float fireCountdown = 0f;
    [Header("Unity Setup Fields")]
    string playerTag = "Player";
    public Transform partToRotate;
    public float turnSpeed = 10f;
    public GameObject bulletPrefab;
    public Transform firePoint;
    // Use this for initialization
    void Start () {
        InvokeRepeating("UpdateTarget", 0f, 0.5f);
    }
    void UpdateTarget() {
        GameObject[] players = GameObject.FindGameObjectsWithTag(playerTag);
        float shortestDistance = Mathf.Infinity;
        GameObject nearestPlayer = null;
        foreach(GameObject player in players) {
            float distanceToPlayer = Vector3.Distance(transform.position, player.transform.position);
            if(distanceToPlayer < shortestDistance) {
                shortestDistance = distanceToPlayer;
                nearestPlayer = player;
            }
            else {
                target = null;
            }
        }
        if(nearestPlayer != null && shortestDistance <= range) {
            target = nearestPlayer.transform;
        }
    }
    // Update is called once per frame
    void Update () {
        if(target == null)
            return;
        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);

        if(fireCountdown <= 0f) {
            Shoot();
            fireCountdown = 1f / fireRate;
        }
        fireCountdown -= Time.deltaTime;
    }
    void Shoot() {
        GameObject bulletGO = (GameObject)Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
        TurretBullet bullet = bulletGO.GetComponent<TurretBullet>();
        if (bullet != null)
        bullet.Seek(target);
    }
    void OnDrawGizmosSelected() {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, range);
    }
}

项目符号跟随玩家,因为您每次都将项目符号位置与当前玩家位置进行比较:

Vector3 dir = target.position - transform.position;

Transform 是引用类型,因此target字段将获取相同的对象,而不是其副本。

您应该改为复制原始位置。要制作副本,请分配target.position - Vector3struct,因此,是一种值类型:

private Vector3 position;
public void Seek(Transform _target)
{
    position = _target.position;
}

详细信息:值类型和引用类型

也许是这样的东西?炮塔子弹类:

private bool aimed = false;
public void Seek(Transform _target) {
if(!aimed){
    target = _target;
    aimed = true;
}
}

最新更新