Почему при запуске игры скрипт отключается ? Мне нужно включить его после запуска игры

#c# #unity3d

#c# #unity3d

Вопрос:

У меня есть пуля с именем сборного файла. Я перетащил сборку и положил ее под оружие. Скрипт включен, но при запуске игры скрипт отключен, и мне нужно снова его включить.

На скриншоте сборный элемент находится посередине. Слева в иерархии маркер находится под SciFiRifle(Клонирование) справа в Инспекторе внизу есть прикрепленный скрипт с именем Shooting.

Скрипт включен.

Но затем, когда я запускаю игру, скрипт по какой-то причине отключается: сначала по какой-то причине мне также нужно свернуть SciFiRifle (клон), чтобы снова увидеть маркер в иерархии :

Нужно свернуть

И скрипт выключен :

Отключено

Я не могу понять, почему он скрывает маркер в иерархии и отключает скрипт при запуске игры.

Скрипт :

 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);
        }
    }
}
 

Обновить :

Я нашел, в чем проблема. Пока не знаю, как это решить. Вторым дочерним элементом в Иерархии Object является Sci-Fi_Soldier.

И к Sci-Fi_Soldier прикреплены несколько скриптов, один из них — контроллер игрока, это не мой скрипт.

Некоторые свойства этого скрипта в инспекторе становятся правильными. То, что я назначил для правильного развлечения, — это SciFiRifle(клон), а пуля — дочерний элемент SciFiRifle(клон).

Вы можете видеть, что он помечен желтым цветом :

Пистолет

Если я удалю этот скрипт на всех контроллерах плеера, тогда сценарий, запускающий пулю, останется включенным, и он останется свернутым.

Я не могу понять, в чем проблема в скрипте контроллера плеера :

 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;
    }
}
 

Он скрывает маркер в иерархии, а также отключает запуск скрипта. Но сценарий съемки не используется нигде в Иерархии или в каких-либо других сценариях. Но, попытавшись удалить скрипты, я обнаружил, что именно этот скрипт создает проблему с пулей.

Это скриншот инспектора SciFiRifle (клон) :

SciFiRifle(клонирование)

Комментарии:

1. Возможно, потому, что какой-то другой скрипт отключает его … попробуйте отключить другие скрипты, пока не сможете найти, какой из них является виновником

2. Попробуйте получить скрипт GetComponent и вызвать script.SetActive(true) .

3. Я нашел причину проблемы, но все еще не могу понять, в чем проблема или почему это происходит. Я обновлю то, что я нашел в своем вопросе.

4. самое главное: пуля не должна порождаться как дочерний элемент пистолета! Если вы это сделаете, все выпущенные пули будут переведены / масштабированы / повернуты вместе с объектом player или gun, чтобы вы могли «контролировать» их путь после их запуска ^^ Пули должны скорее появляться в никогда не перемещаемый объект, чтобы они следовали своему пути прямо и независимо

Ответ №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 поля, либо удалить Научно-фантастическую винтовку из сборки.