禁用附加到的游戏对象后 Unity 脚本未禁用
Unity script not disabling after disabling gameobject attached to
我有一个游戏对象 (HandGun),我在游戏的某个时刻将其禁用 (setActive(false))。 HandGun 有一个名为 GunController 的脚本,它会在我每次按下扳机时负责射击。
问题是,当我禁用 HandGun 时,我仍然可以射击并看到子弹从无到有,因为 HandGun 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。
我做错了什么?我该怎么办?
无论如何,提前感谢您的帮助!
脚本在禁用的游戏对象上时仍然可以执行代码。
但是更新函数不会触发。
鉴于您的 GunController 没有使用它的 Update(),我怀疑您的输入侦听器在其他地方(可能是 EZEffect?)。
要防止您的控制器触发,您可以在代码中添加一个检查。
private void TriggerPressed(object sender, ClickedEventArgs e)
{
if (gameobject.ActiveSelf)
{
shootWeapon();
}
}
或者您可以禁用侦听用户输入的脚本
非活动组件不会调用 MonoBehavior 派生方法,如 Start()、Update() 等。但是,您仍然可以调用属于非活动游戏对象的脚本方法。
当对象变为 active/inactive 时,您可以 add/remove 事件处理程序,方法是向 GunController 添加 OnEnable/Disable 方法:
void OnEnable() {
controller.TriggerClicked += TriggerPressed;
}
void OnDisable() {
controller.TriggerClicked -= TriggerPressed;
}
我有一个游戏对象 (HandGun),我在游戏的某个时刻将其禁用 (setActive(false))。 HandGun 有一个名为 GunController 的脚本,它会在我每次按下扳机时负责射击。
问题是,当我禁用 HandGun 时,我仍然可以射击并看到子弹从无到有,因为 HandGun 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。
我做错了什么?我该怎么办?
无论如何,提前感谢您的帮助!
脚本在禁用的游戏对象上时仍然可以执行代码。
但是更新函数不会触发。 鉴于您的 GunController 没有使用它的 Update(),我怀疑您的输入侦听器在其他地方(可能是 EZEffect?)。
要防止您的控制器触发,您可以在代码中添加一个检查。
private void TriggerPressed(object sender, ClickedEventArgs e)
{
if (gameobject.ActiveSelf)
{
shootWeapon();
}
}
或者您可以禁用侦听用户输入的脚本
非活动组件不会调用 MonoBehavior 派生方法,如 Start()、Update() 等。但是,您仍然可以调用属于非活动游戏对象的脚本方法。
当对象变为 active/inactive 时,您可以 add/remove 事件处理程序,方法是向 GunController 添加 OnEnable/Disable 方法:
void OnEnable() {
controller.TriggerClicked += TriggerPressed;
}
void OnDisable() {
controller.TriggerClicked -= TriggerPressed;
}