Скрипт Unity не отключается после отключения игрового объекта, прикрепленного к - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть GameObject (HandGun), который я отключаю (setActive (false)) в определенный момент игры. К ручному оружию прикреплен скрипт с именем GunController, который заботится о стрельбе каждый раз, когда я нажимаю на курок.

Дело в том, что когда я отключаю пистолет, я все еще могу стрелять и видеть пулю из ничего, потому что объект GameGun GameObject успешно пропал.

Сценарий GunController:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using EZEffects;
public class GunController : MonoBehaviour {

public GameObject controllerRight;
public AudioClip clip;
AudioSource sound;
public int damage;
private SteamVR_TrackedObject trackedObj;
public SteamVR_Controller.Device device;

private SteamVR_TrackedController controller;

public EffectTracer TracerEffect;
public EffectImpact ImpactEffect;
public Transform muzzleTransform;

// Use this for initialization
void Start () {
    sound = gameObject.AddComponent<AudioSource>();
    controller = controllerRight.GetComponent<SteamVR_TrackedController>();
    controller.TriggerClicked += TriggerPressed;
    trackedObj = controllerRight.GetComponent<SteamVR_TrackedObject>();
    device = SteamVR_Controller.Input((int)trackedObj.index);
}

private void TriggerPressed(object sender, ClickedEventArgs e)
{
    shootWeapon();
}

public void shootWeapon()
{
    sound.PlayOneShot(clip,0.2f);
    RaycastHit hit = new RaycastHit();
    Ray ray = new Ray(muzzleTransform.position, muzzleTransform.forward);
    device.TriggerHapticPulse(3999);



    TracerEffect.ShowTracerEffect(muzzleTransform.position, muzzleTransform.forward, 250f);

    if(Physics.Raycast(ray, out hit, 5000f))
    {
        if (hit.collider.attachedRigidbody)
        {
            Enemy enemy = hit.collider.gameObject.GetComponent<Enemy>();
            if (enemy)
            {
                enemy.TakeDamage(damage);


            }
            ImpactEffect.ShowImpactEffect(hit.transform.position);
        }
    }

}

// Update is called once per frame
void Update () {

}
}

Часть скрипта Inspector, которая отключает игровой объект HandGun:

public void showShop()
{
    shop.SetActive(true);
    shopActive = true;
    if (actualGun == null)
    {
        actualGun = handGun;
    }
    actualGun.SetActive(false);
    model.SetActive(true);
}

Более того, если я деактивирую скрипт GunController вручную, когда игра запущена, я все равно могу стрелять, чего я совершенно не понимаю. Я использую EZEffect, которое можно найти в магазине Unity.

Что я делаю не так? Что мне делать?

В любом случае, заранее благодарю за помощь!

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Неактивные компоненты не будут вызывать производные от MonoBehavior методы, такие как Start (), Update () и т. Д. Однако вы все равно можете вызывать методы сценариев, принадлежащих неактивным игровым объектам.

Вы можете добавлять / удалять обработчики событий, когда объект становится активным / неактивным, добавляя методы OnEnable / Disable в GunController:

void OnEnable() {
    controller.TriggerClicked += TriggerPressed;
}

void OnDisable() {
    controller.TriggerClicked -= TriggerPressed;
}
0 голосов
/ 25 апреля 2018

Скрипт может выполнять код, если он находится на отключенном игровом объекте.

Однако функция обновления не будет запускаться.Поскольку ваш GunController не использует свою функцию Update (), я подозреваю, что ваш слушатель ввода находится где-то еще (вероятно, EZEffect?).

Чтобы предотвратить срабатывание контроллера, вы можете добавить проверку к своему коду.

private void TriggerPressed(object sender, ClickedEventArgs e)
{
    if (gameobject.ActiveSelf)
    {
        shootWeapon();
    }        
}

Или вы можете отключить прослушивание скрипта для пользовательского ввода

...