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