为什么在启动游戏时关闭脚本?我需要在游戏运行后将其打开

时间:2019-04-18 02:46:40

标签: c# unity3d

我有一个预制名称子弹。 我拖了预制件,把它放在武器下。 脚本已打开,但是在开始游戏时,脚本已关闭,我需要再次将其打开。

在屏幕快照中,子弹预制件位于中间。在层次结构的左侧,项目符号位于底部的“检查器”中右侧的SciFiRifle(Clone)下,并附加了名为“射击”的脚本。

脚本已打开。

但是当我运行游戏时,由于某种原因该脚本被关闭: 首先出于某种原因,我还需要折叠SciFiRifle(Clone)才能在层次结构中再次看到项目符号:

Need to collapse

脚本已关闭:

Turned off

我不知道为什么在运行游戏时它会在层次结构中隐藏项目符号并关闭脚本。

脚本:

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

public class Shooting : MonoBehaviour
{
    public GameObject projectile;
    public Animator anim;

    private void Start()
    {
        anim.SetBool("Shooting", true);
    }

    private void Update()
    {
        if (anim.GetBool("Shooting") == true)
        {
            GameObject bullet = Instantiate(projectile, transform.position, Quaternion.identity) as GameObject;
            bullet.GetComponent<Rigidbody>().AddForce(transform.forward * 10, ForceMode.VelocityChange);
        }
    }
}

更新:

我发现了问题所在。尚未解决。 对象层次结构中的第二个孩子是Sci-Fi_Soldier。

在Sci-Fi_Soldier上附加了一些脚本,其中之一是Player Controller,它不是我的脚本。

此脚本在“检查器”中的某些属性为Right Gun,我分配给Right Fun的是SciFiRifle(Clone),而Bullet是SciFiRifle(Clone)的子代。

您会看到它以黄色标记:

Gun

如果我要在所有播放器控制器上都删除此脚本,则“在子弹上射击”脚本将保持打开状态,并且将保持折叠状态。

我不知道是什么导致了Player Controller脚本中的问题:

using UnityEngine;
using System.Collections;

[RequireComponent (typeof (Animator))]
public class PlayerController : MonoBehaviour {

    public Transform rightGunBone;
    public Transform leftGunBone;
    public Arsenal[] arsenal;

    private Animator animator;

    void Awake() {
        animator = GetComponent<Animator> ();
        if (arsenal.Length > 0)
            SetArsenal (arsenal[0].name);
        }

    public void SetArsenal(string name) {
        foreach (Arsenal hand in arsenal) {
            if (hand.name == name) {
                if (rightGunBone.childCount > 0)
                    Destroy(rightGunBone.GetChild(0).gameObject);
                if (leftGunBone.childCount > 0)
                    Destroy(leftGunBone.GetChild(0).gameObject);
                if (hand.rightGun != null) {
                    GameObject newRightGun = (GameObject) Instantiate(hand.rightGun);
                    newRightGun.transform.parent = rightGunBone;
                    newRightGun.transform.localPosition = Vector3.zero;
                    newRightGun.transform.localRotation = Quaternion.Euler(90, 0, 0);
                    }
                if (hand.leftGun != null) {
                    GameObject newLeftGun = (GameObject) Instantiate(hand.leftGun);
                    newLeftGun.transform.parent = leftGunBone;
                    newLeftGun.transform.localPosition = Vector3.zero;
                    newLeftGun.transform.localRotation = Quaternion.Euler(90, 0, 0);
                }
                animator.runtimeAnimatorController = hand.controller;
                return;
                }
        }
    }

    [System.Serializable]
    public struct Arsenal {
        public string name;
        public GameObject rightGun;
        public GameObject leftGun;
        public RuntimeAnimatorController controller;
    }
}

它将子弹隐藏在层次结构中,并且还关闭了脚本射击。但是,在“层次结构”或其他任何脚本中的任何其他地方都没有使用“射击”脚本。但是通过尝试删除脚本,我发现该脚本是导致Bullet问题的脚本。

这是SciFiRifle(Clone)的Inspector屏幕截图:

SciFiRifle(Clone)

1 个答案:

答案 0 :(得分:1)

PlayerController脚本实际上销毁了您的科幻步枪(放在预制件中的步枪),然后使用Right Gun脚本的PlayerController字段中提供的一个实例化了一个新步枪。这就是为什么您需要再次将其收起的原因,因为您看到的是步枪预制件的新实例)。

PlayerController中描述此行为的行是:

                if (rightGunBone.childCount > 0)
                    Destroy(rightGunBone.GetChild(0).gameObject);

哪个会破坏您放在预制件中的步枪。并且:

                if (hand.rightGun != null) {
                    GameObject newRightGun = (GameObject) Instantiate(hand.rightGun);
                    newRightGun.transform.parent = rightGunBone;

会在Right Gun字段中生成您提供的预制件的新实例,以替换您放入预制件中的步枪。

您可以尝试:从PlayerController字段中删除预制件,或从预制件中删除科幻步枪。