团结 | Find只能从主线程调用
Untiy | Find can only be called from the main thread
我想在按下我创建的按钮时移动名为 "Capsule" 的游戏对象。此时 json 数据发送到服务器。我只是想测试按钮是否可以控制游戏对象。
这是我从现在开始完成的脚本,现在发生了错误。
请给我一些想法来解决这个问题。我只想在按下按钮时控制名为 "Capsule" 的 gambject。
using UnityEngine;
using System.Collections;
using SimpleJSON;
using UXLib;
using UXLib.Base;
using System.Collections.Generic;
public class Main : MonoBehaviour {
public int Speed;
PadController padController;
public float time;
void Start () {
padController = PadController.Instance;
}
public void init(){
}
// Update is called once per frame
void Update () {
}
public void OnTouchStart(string name, string time){
//ObjectMoveStart();
Debug.Log ("TouchStart -> name : " + name + ", time : " + time);
}
public void OnTouchEnd(string name, string time){
//ObjectMoveEnd();
Debug.Log ("TouchEnd -> name : " + name + ", time : " + time);
}
public void ObjectMoveStart(){
GameObject cap = GameObject.Find("Capsule");
cap.transform.Translate(Vector3.left * 10 * 10.0f);
}
public void ObjectMoveEnd(){
GameObject cap = GameObject.Find("Capsule");
cap.transform.Translate(Vector3.left * 0 * 0.0f);
}
void OnGUI() {
GUI.color = Color.white;
GUI.skin.label.fontSize = 30;
GUI.skin.button.fontSize = 30;
//GUI.Label(new Rect(20, 40, 1600, 800), ">"+logString);
if (GUI.Button (new Rect (10, 0, 80, 40), "Type1")) {
// padType1 선택
padController.Init (PadController.PAD_TYPE1);
//Arrow Buttons
padController.SetPosition (0, -3.5f, -2.5f);
padController.SetPosition (1, -6.0f, 0.0f);
padController.SetPosition (2, -1.0f, 0.0f);
padController.SetPosition (3, -3.5f, 2.5f);
padController.SetVisible (0, true);
padController.SetVisible (1, true);
padController.SetVisible (2, true);
padController.SetVisible (3, true);
//Alphabet Buttons
padController.SetPosition (4, 4.5f, 1.5f);
padController.SetPosition (5, 3.0f, 0.0f);
padController.SetPosition (6, 6.0f, 0.0f);
padController.SetPosition (7, 4.5f, -1.5f);
padController.SetVisible (4, true);
padController.SetVisible (5, true);
padController.SetVisible (6, true);
padController.SetVisible (7, true);
padController.OnTouchStart += OnTouchStart;
padController.OnTouchEnd += OnTouchEnd;
//padController.OnMoveStart += ObjectMoveStart;
//padController.OnMoveEnd += ObjectMoveEnd;
padController.Load ();
}
}
}
这是发生的错误。
Find 只能从主线程调用。
加载场景时,将从加载线程执行构造函数和字段初始化程序。
不要在构造函数或字段初始值设定项中使用此函数,而是将初始化代码移至 Awake 或 Start 函数。
将您的 GameObject.Find 调用移至 Start()
既然你在调用同一个游戏对象"Capsule"你为什么不在开始时调用它一次并引用它。
在所有方法声明之外。
GameObject cap;
void Start(){
cap = GameObject.Find("Capsule");
}
然后删除所有其他 GameObject.Find。每次都找同一个对象是无关紧要的
GameObject.Find是UnityEngine中最慢的Call函数。考虑通过拖动游戏对象来在检查器中引用游戏对象。
我在我的项目中使用了套接字,我试图移动名为 cap 的游戏对象。但是连接事件是不可能的。我决定如下。
void Awake () {
Connect();
for (int i = 0; i < 4; i++) {
players[i] = GameObject.Find("Capsule_"+i);
players[i].renderer.enabled = false;
}
}
void Start() {
for (int i=0; i < 4; i++) {
userNames[i] = GameObject.FindGameObjectWithTag("UserName"+i);
//userNames[i].renderer.enabled = false;
userNames[i].SetActive(false);
}
}
public void Connect() {
connectController = UXConnectController.Instance;
connectController.Init (HOST_UID);
connectController.SocketOpen();
connectController.OnReceived += OnReceived;
connectController.OnUserAdded += OnAddUser;
connectController.Join ("host", "cmd", "username");
}
我想在按下我创建的按钮时移动名为 "Capsule" 的游戏对象。此时 json 数据发送到服务器。我只是想测试按钮是否可以控制游戏对象。 这是我从现在开始完成的脚本,现在发生了错误。 请给我一些想法来解决这个问题。我只想在按下按钮时控制名为 "Capsule" 的 gambject。
using UnityEngine;
using System.Collections;
using SimpleJSON;
using UXLib;
using UXLib.Base;
using System.Collections.Generic;
public class Main : MonoBehaviour {
public int Speed;
PadController padController;
public float time;
void Start () {
padController = PadController.Instance;
}
public void init(){
}
// Update is called once per frame
void Update () {
}
public void OnTouchStart(string name, string time){
//ObjectMoveStart();
Debug.Log ("TouchStart -> name : " + name + ", time : " + time);
}
public void OnTouchEnd(string name, string time){
//ObjectMoveEnd();
Debug.Log ("TouchEnd -> name : " + name + ", time : " + time);
}
public void ObjectMoveStart(){
GameObject cap = GameObject.Find("Capsule");
cap.transform.Translate(Vector3.left * 10 * 10.0f);
}
public void ObjectMoveEnd(){
GameObject cap = GameObject.Find("Capsule");
cap.transform.Translate(Vector3.left * 0 * 0.0f);
}
void OnGUI() {
GUI.color = Color.white;
GUI.skin.label.fontSize = 30;
GUI.skin.button.fontSize = 30;
//GUI.Label(new Rect(20, 40, 1600, 800), ">"+logString);
if (GUI.Button (new Rect (10, 0, 80, 40), "Type1")) {
// padType1 선택
padController.Init (PadController.PAD_TYPE1);
//Arrow Buttons
padController.SetPosition (0, -3.5f, -2.5f);
padController.SetPosition (1, -6.0f, 0.0f);
padController.SetPosition (2, -1.0f, 0.0f);
padController.SetPosition (3, -3.5f, 2.5f);
padController.SetVisible (0, true);
padController.SetVisible (1, true);
padController.SetVisible (2, true);
padController.SetVisible (3, true);
//Alphabet Buttons
padController.SetPosition (4, 4.5f, 1.5f);
padController.SetPosition (5, 3.0f, 0.0f);
padController.SetPosition (6, 6.0f, 0.0f);
padController.SetPosition (7, 4.5f, -1.5f);
padController.SetVisible (4, true);
padController.SetVisible (5, true);
padController.SetVisible (6, true);
padController.SetVisible (7, true);
padController.OnTouchStart += OnTouchStart;
padController.OnTouchEnd += OnTouchEnd;
//padController.OnMoveStart += ObjectMoveStart;
//padController.OnMoveEnd += ObjectMoveEnd;
padController.Load ();
}
}
}
这是发生的错误。
Find 只能从主线程调用。 加载场景时,将从加载线程执行构造函数和字段初始化程序。 不要在构造函数或字段初始值设定项中使用此函数,而是将初始化代码移至 Awake 或 Start 函数。
将您的 GameObject.Find 调用移至 Start()
既然你在调用同一个游戏对象"Capsule"你为什么不在开始时调用它一次并引用它。
在所有方法声明之外。
GameObject cap;
void Start(){
cap = GameObject.Find("Capsule");
}
然后删除所有其他 GameObject.Find。每次都找同一个对象是无关紧要的
GameObject.Find是UnityEngine中最慢的Call函数。考虑通过拖动游戏对象来在检查器中引用游戏对象。
我在我的项目中使用了套接字,我试图移动名为 cap 的游戏对象。但是连接事件是不可能的。我决定如下。
void Awake () {
Connect();
for (int i = 0; i < 4; i++) {
players[i] = GameObject.Find("Capsule_"+i);
players[i].renderer.enabled = false;
}
}
void Start() {
for (int i=0; i < 4; i++) {
userNames[i] = GameObject.FindGameObjectWithTag("UserName"+i);
//userNames[i].renderer.enabled = false;
userNames[i].SetActive(false);
}
}
public void Connect() {
connectController = UXConnectController.Instance;
connectController.Init (HOST_UID);
connectController.SocketOpen();
connectController.OnReceived += OnReceived;
connectController.OnUserAdded += OnAddUser;
connectController.Join ("host", "cmd", "username");
}