Создайте 2 отдельных экземпляра одного и того же сборного - PullRequest
0 голосов
/ 10 декабря 2018

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

Keypads Image

Вот скрипт к ним:

using UnityEngine;
using UnityEngine.UI;

public class LockSystemScript : MonoBehaviour
{

    public Text ScreenText;

    private int _taps;
    private Color _startColor;
    private AudioSource _clickSound;
    private RequestsManager _requestsManager;
    private Vector3 _screenCenter;

    private void Start ()
    {
        _taps = 0;
        _startColor = ScreenText.color;
        _clickSound = GetComponent<AudioSource>();
        _requestsManager = RequestsManager.Instance;
        _screenCenter = GetScreenCenter();
    }

    private void Update () {

        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(_screenCenter);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit, 100) && hit.transform.gameObject.tag.Equals("Button") && _taps <= 3)
            {
                ScreenText.text += hit.transform.name;
                _clickSound.Play();
                _taps++;
            }

            if (hit.transform.gameObject.tag.Equals("Submit"))
            {
                _clickSound.Play();
                StartCoroutine(_requestsManager.InputCode(ScreenText.text, ScreenText));
            }

            if (hit.transform.gameObject.tag.Equals("Reset"))
            {
                _taps = 0;
                ScreenText.color = _startColor;
                ScreenText.text = "";
                _clickSound.Play();
            }
        }
    }

    private Vector3 GetScreenCenter()
    {
        float screenX = Screen.width / 2;
        float screenY = Screen.height / 2;
        return new Vector3(screenX, screenY, 0);
    }
}

1 Ответ

0 голосов
/ 10 декабря 2018

На самом деле у вас есть два отдельных экземпляра LockSystem, а с каждым из них отдельный экземпляр LockSystemScript.Вы допустили ошибку в следующей строке:

if (Physics.Raycast(ray, out hit, 100) && hit.transform.gameObject.tag.Equals("Button") && _taps <= 3)

Здесь вы проверяете, попадает ли Raycast() в объект и является ли этот объект Button.Проблема в том, что Update() вызывается на каждом MonoBehaviour в вашей сцене, поэтому он вызывается для обоих экземпляров LockSystemScript, и независимо от того, на что LockSystem вы смотрите, вы смотрите на Buttonи вышеприведенное утверждение: true.

Что вы должны сделать, это следующее:

if (Physics.Raycast(ray, out hit, 100) && hit.transform.gameObject.tag.Equals("Button") && _taps <= 3 && hit.transform.isChildOf(this.transform))

Таким образом, вы проверяете, действительно ли Button, на который вы смотрите, действительно принадлежитк сценарию, в котором Update() запускается прямо сейчас.

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