我试图在下面创建2个单独的键盘预制件实例。 问题在于,我点击哪一个都没关系,它们都响应并显示相同的输出。 我的猜测是,它们都引用附加到预制件的相同脚本,而我不知道如何为同一脚本创建2个单独的实例。
此处附有脚本:
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);
}
}
答案 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()
的脚本。