创建同一预制件的2个单独实例

时间:2018-12-09 21:36:02

标签: c# unity3d

我试图在下面创建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 :(得分:0)

您实际上确实有两个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()的脚本。