Сценарий 2 объектов единства может получить переменные друг друга? {} ANSWERED - PullRequest
0 голосов
/ 09 апреля 2020

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

Проблема в том, что только один из сценариев может читать переменные другого и воздействовать на него, в то время как другой не может сделать то же самое, вместо этого говоря, что он не существует, даже если я назначил его в инспектор

Это ограничение единства?

scriptA

public GameObject Player;
    Animator animator;
    scriptB player;
void Start()
{
    animator = GetComponent<Animator>();//animations are all set up
    player = Player.GetComponent<scriptB>();
}
public bool leftpunch = false;
public bool rightpunch = false;

if (player.lowleftpunch|| player.lowrightpunch|| player.highleftpunch|| player.highrightpunch)
    {
        animator.SetTrigger("block");
    }

scriptB <- единство, по-видимому, не видно сценарий A с этим, несмотря на то, что он был правильно назначен в инспекторе другие с работы. </p>

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Это, конечно, не ограничение Unity.

Попробуйте сериализовать прямые ссылки на типы скриптов, к которым вы хотите получить доступ, вместо сериализации GameObjects.

public class ClassA : MonoBehaviour
{
    [SerializeField] private ClassB _classB = default;
    [SerializeField] private string _message = "Message from ClassA";

    private void Start()
    {
        // Will print the value assigned in the inspector for the component
        // of ClassB.
        Debug.Log(_classB.GetValue());
    }

    public string GetMessage()
    {
        return _message;
    }
}

public class ClassB : MonoBehaviour
{
    [SerializeField] private ClassA _classA = default;
    [SerializeField] private float _value = 3.14f;

    private void Start()
    {
        // Will print the message assigned in the inspector for the component
        // of ClassA.
        Debug.Log(_classA.GetMessage());
    }

    public float GetValue()
    {
        return _value;
    }
}

Не видя вашего сообщение об ошибке, и, не видя ваш полный код, может показаться, что GetComponent<T>() не работает по одной из следующих причин:

  1. GameObject не назначен в инспекторе.
  2. Назначенный в инспекторе GameObject не имеет компонента, который вы пытаетесь получить.

В обоих случаях вы увидите сообщение NullReferenceException в окне консоли.

0 голосов
/ 09 апреля 2020

GetComponent используется для gameObject, чтобы получить один из сценариев, назначенных ему в инспекторе. Так что если у вас есть скрипт Example1, прикрепленный к одному gameOBject:

public class Example1 : MonoBehaviour
{
    public string customMessage = "Hi there.";

    // Start is called before the first frame update
    void Start()
    {

    }

}

И еще один игровой объект с присоединенным Example2:

public class Example2 : MonoBehaviour
{
    public GameObject otherGameObject;

    Example1 example1Component; 

    // Start is called before the first frame update
    void Start()
    {
        //gets script instance from gameObject;
        example1Component = otherGameObject.GetComponent<Example1>();

        //reads message from variable on script instance
        Debug.Log(example1Component.customMessage);
    }

}

, который будет обращаться к переменным из другого скрипта. Кроме того, вы можете сделать свою пользовательскую переменную типом другого скрипта, и когда вы перетаскиваете ее в инспектор единства, она напрямую ссылается на этот скрипт. и любая переменная publi c также может быть легко доступна. вот так:

public class Example2 : MonoBehaviour
{
    //already referencing other script
    public Example1 otherComponent; 

    // Start is called before the first frame update
    void Start()
    {
        //reads message from variable on script instance
        Debug.Log(otherComponent.customMessage);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...