【问题标题】:Turret bullet follows the player炮塔子弹跟随玩家
【发布时间】:2018-01-14 00:42:50
【问题描述】:

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

TurretBullet 类:

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);
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    子弹跟随玩家,因为您每次都将子弹位置与当前玩家位置进行比较:

    Vector3 dir = target.position - transform.position;
    

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

    您应该改为复制原始位置。要进行复制,请将 target.position - Vector3 赋值为 struct,因此,它是一个值类型:

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

    更多信息:Value Type and Reference Type

    【讨论】:

    • 我用它来获得我在不同班级的目标位置。对不起,我没有把事情弄清楚。我会发布其他课程
    【解决方案2】:

    也许是这样的? TurretBullet 类:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多