如何在不激活原始对象的情况下激活实例化对象的组件

问题描述 投票:0回答:1

我正在尝试在我的游戏中添加一个子弹制作系统,您可以在其中制作具有可自定义属性的子弹。我一直在测试枪找到子弹并实例化它的方法。 子弹在构建后处于非活动状态,只有从枪中实例化的子弹才是活动的

我遇到了一个奇怪的问题,一旦我的枪开火,原来的子弹就会变得活跃(这会导致它飞到墙上并被摧毁)。

以下是我想要发生的事情的基本摘要: 我的子弹制造器脚本在喂入某些对象时会增加其速度和伤害值,当您单击它时,它会创建一个“子弹”对象,并将这些值放入“射弹”脚本中。 脚本已停用

我的子弹查找器脚本引用了其盒子碰撞器内的“子弹”对象。

我的枪脚本实例化了“子弹”,但激活了射弹脚本。

我一直在网上寻找一种方法来激活实例化的项目符号而不激活原始的项目符号,但我还没有找到任何东西。几乎所有与实例化相关的帖子都只考虑预制件,而不考虑场景中对象的实例化。

这是我与问题相关的脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BulletMaker : MonoBehaviour
{
    bool bulletReady = true;
    public float bulletDamage = 0f;
    public float bulletSpeed = 0f;
    Projectile projectile;
    public Transform bulletDrop;
    void Start()
    {
        
    }
    void Update()
    {
        
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Red"))
        {
            bulletDamage += 10;
            Destroy(other.gameObject);
        }
        if (other.CompareTag("Blue"))
        {
            bulletSpeed += 100;
            Destroy(other.gameObject);
        }
    }

    private void OnMouseDown()
    {
        if (bulletReady)
        {
            GameObject bullet = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            bullet.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
            bullet.transform.position = bulletDrop.position;
            bullet.AddComponent<Rigidbody>();
            bullet.GetComponent<Rigidbody>().useGravity = false;
            bullet.AddComponent<Projectile>();
            bullet.GetComponent<Projectile>().speed = bulletSpeed;
            bullet.GetComponent<Projectile>().damage = bulletDamage;
            bullet.GetComponent<Projectile>().enabled = false;
        }
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BulletFinder : MonoBehaviour
{
    public GameObject selectedBullet;
    void Start()
    {

    }
    void Update()
    {

    }

    private void OnTriggerStay(Collider other)
    {
        selectedBullet = other.gameObject;
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Gun : MonoBehaviour
{
    public Transform muzzle;
    public int magazineSize;
    public int bulletsInMag;
    public float reloadTime = 3;
    bool reloading = false;
    BulletFinder bulletFinder;
    void Start()
    {
        bulletFinder = GameObject.Find("Bullet Holder").GetComponent<BulletFinder>();
    }

    // Update is called once per frame
    void Update()
    {
        if (bulletFinder.selectedBullet != null)
        {
            if (Input.GetKeyDown(KeyCode.Mouse0) && bulletsInMag > 0)
            {
                Shoot();
            }
            else if ((Input.GetKeyDown(KeyCode.Mouse0) && bulletsInMag <= 0 && !reloading))
            {
                Reload();
            }
        }
    }
    private void Shoot()
    {
        if (bulletFinder.selectedBullet != null)
        {
            Instantiate(bulletFinder.selectedBullet, muzzle.position, muzzle.rotation);
            bulletFinder.selectedBullet.GetComponent<Projectile>().enabled = true;
            bulletsInMag--;

        }
    }

    private void Reload()
    {
        reloading = true;
        StartCoroutine(ReloadTime());
    }

    IEnumerator ReloadTime()
    {
        yield return new WaitForSeconds(reloadTime);
        bulletsInMag = magazineSize;
        reloading = false;
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Projectile : MonoBehaviour
{
    public float damage;
    public float speed;
    private Rigidbody projectile;
    bool active = true;
    BulletMaker bulletMaker;
    void Start()
    {
        projectile = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (active & projectile != null)
        {
            projectile.AddForce(transform.forward * Time.deltaTime * speed, ForceMode.Impulse);
        }
    }

    private void OnCollisionEnter(Collision collision)
    {
        Destroy(gameObject);
    }
}
c# unity-game-engine instantiation
1个回答
0
投票

因为您确实激活了原始项目符号,所以正确的做法是启用实例化的项目符号。

var bullet = Instantiate(bulletFinder.selectedBullet, muzzle.position, muzzle.rotation);
bullet.GetComponent<Projectile>().enabled = true;
© www.soinside.com 2019 - 2024. All rights reserved.