unity3d 如何按名称查找预制件

daolsyd0  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(336)

我遇到了一个问题,如果舞台上已经有一个预制件,我需要阻止创建一个新的对象(预制件)。我用GameObject.FindWithTag解决了这个问题,但也许还有其他方法

using UnityEngine;

public class CreateBullet : MonoBehaviour
{
public Transform firePoint;
public GameObject ballPrefab;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (GameObject.FindWithTag("ballBullet") == null)
            {
                CreatingBulletBall();
            }
        }
    }

    void CreatingBulletBall()
    {
        Instantiate(ballPrefab, firePoint.position, firePoint.rotation);
    }

}
soat7uwm

soat7uwm1#

下面是你应该做的:
1.使用以下代码创建脚本Bullet.cs;
1.将其作为组件添加到子弹预制件中;
1.如下所示更改CreateBullet类;
1.将项目符号预置分配给CreateBullet组件的ballPrefab字段(如果在脚本更改后未分配)。
工作原理:如果_bullet字段为空,则创建新的项目符号并存储在其中。当项目符号被销毁时,它触发事件Destroyed。回调OnBulletDestroyed将为_bullet分配空值,以便可以再次创建它。
文件CreateBullet.cs

public class CreateBullet : MonoBehaviour
    {
        public Transform firePoint;
        public Bullet ballPrefab;
    
        private void Update()
        {
            if (Input.GetMouseButtonDown(0))
                TryCreateBulletBall();
        }
    
        private Bullet? _bullet = null;
    
        private void TryCreateBulletBall()
        {
            if (this._bullet != null)
                return;
            this._bullet = Instantiate(ballPrefab, firePoint.position, firePoint.rotation);
            this._bullet.Destroyed += this.OnBulletDestroyed;
        }
    
        private void OnBulletDestroyed()
        {
            this._bullet.Destroyed -= this.OnBulletDestroyed;
            this._bullet = null;
        }
    }

文件Bullet.cs

public class Bullet : MonoBehaviour
    {
        public event Action? Destroyed;
    
        private void OnDestroy()
        {
            this.Destroyed?.Invoke();
        }
    }

没有测试过,但应该能用,能用。

    • 更新日期:**
    • 关于性能:**

就性能而言,这是非常好的,习惯上只存储一次对对象的引用(通过Inspector,在Start/Awake钩子中,当对象被示例化时,等等),而不是在Update钩子中调用Find...()GetComponent()方法中的任何一个。docs for Find()方法声明您应该避免在每一帧都调用它。

    • 代码的简化版本。**正如@derHugo在注解中所指出的,只有以下代码就足够了:

文件CreateBullet.cs

public class CreateBullet : MonoBehaviour
    {
        public Transform firePoint;
        public GameObject ballPrefab;
    
        private void Update()
        {
            if (Input.GetMouseButtonDown(0))
                TryCreateBulletBall();
        }
    
        private GameObject _bullet;
    
        private void TryCreateBulletBall()
        {
            if (this._bullet)
                return;
            this._bullet = Instantiate(ballPrefab, firePoint.position, firePoint.rotation);
        }
    }

相关问题