get_transform can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
при выполнении метода ProcessReceive. раньше такого вроде не было. все норм работало. сегодня первый раз вижу эту ошибку.
Вот код
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System;
public class Client: MonoBehaviour {
private static Socket socket;
private static SocketAsyncEventArgs SockAsyncEventArgs; // объект для асинхронной операции на сокете
private static byte[] buff;
private static int i = 0;
public GameObject me;
public GameObject he;
private Transform HisTrans;
private static Transform hist;
private static Transform MyTrans;
private static Transform oldTrans;
private static Transform newTrans;
private static bool sw=false;
private static void Init()
{
Debug.Log("Init");
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
buff = new byte[256];
SockAsyncEventArgs = new SocketAsyncEventArgs();
// подписываемся на завершение асинхронного соединения
SockAsyncEventArgs.Completed += SockAsyncArgs_Completed;
}
private static void SockAsyncArgs_Completed(object sender, SocketAsyncEventArgs e)
{
Debug.Log("Completed");
switch (e.LastOperation)
{
case SocketAsyncOperation.Connect:
ProcessConnect(e);
break;
case SocketAsyncOperation.Receive:
ProcessReceive(e);
break;
}
}
private static void Start_Connect(string address, int port)
{
Debug.Log("Start_Connect");
SockAsyncEventArgs.RemoteEndPoint = new IPEndPoint(IPAddress.Parse(address), port);
ConnectAsync(SockAsyncEventArgs);
}
private static void ConnectAsync(SocketAsyncEventArgs e)
{
Debug.Log("ConnectAsync");
bool willRaiseEvent = socket.ConnectAsync(e);
if (!willRaiseEvent)
ProcessConnect(e);
}
private static void ProcessConnect(SocketAsyncEventArgs e)
{
Debug.Log("ProcessConnect");
if (e.SocketError == SocketError.Success)
{
SockAsyncEventArgs.SetBuffer(buff, 0, buff.Length);
sw=true;
}
else
Debug.Log("Lost connection with " + e.RemoteEndPoint.ToString());
}
private static void SendAsync(byte[] data)
{
Debug.Log("SendAsync");
if (socket.Connected && data.Length > 0)
{
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
e.SetBuffer(data, 0, data.Length);
e.Completed += SockAsyncArgs_Completed;
bool willRaiseEvent = socket.SendAsync(e);
// Debug.Log("bytes sent: "+data.Length);
}
}
private static void ProcessSend(SocketAsyncEventArgs e)
{
Debug.Log("ProcessSend");
try
{
if (e.SocketError == SocketError.Success)
{
ReceiveAsync(SockAsyncEventArgs);
}
else
{
Debug.Log("Not sended");
}
}
catch (Exception ex)
{
Debug.Log("ProcessSend: " + ex.Message);
}
}
private static void ReceiveAsync(SocketAsyncEventArgs e)
{
Debug.Log("ReceiveAsync");
try
{
bool willRaiseEvent = socket.ReceiveAsync(e);
if (!willRaiseEvent)
ProcessReceive(e);
}
catch (Exception ex)
{
Debug.Log("ReceiveAsync: " + ex.Message);
}
}
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System;
public class Client: MonoBehaviour {
private static Socket socket;
private static SocketAsyncEventArgs SockAsyncEventArgs; // объект для асинхронной операции на сокете
private static byte[] buff;
private static int i = 0;
public GameObject me;
public GameObject he;
private Transform HisTrans;
private static Transform hist;
private static Transform MyTrans;
private static Transform oldTrans;
private static Transform newTrans;
private static bool sw=false;
private static void Init()
{
Debug.Log("Init");
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
buff = new byte[256];
SockAsyncEventArgs = new SocketAsyncEventArgs();
// подписываемся на завершение асинхронного соединения
SockAsyncEventArgs.Completed += SockAsyncArgs_Completed;
}
private static void SockAsyncArgs_Completed(object sender, SocketAsyncEventArgs e)
{
Debug.Log("Completed");
switch (e.LastOperation)
{
case SocketAsyncOperation.Connect:
ProcessConnect(e);
break;
case SocketAsyncOperation.Receive:
ProcessReceive(e);
break;
}
}
private static void Start_Connect(string address, int port)
{
Debug.Log("Start_Connect");
SockAsyncEventArgs.RemoteEndPoint = new IPEndPoint(IPAddress.Parse(address), port);
ConnectAsync(SockAsyncEventArgs);
}
private static void ConnectAsync(SocketAsyncEventArgs e)
{
Debug.Log("ConnectAsync");
bool willRaiseEvent = socket.ConnectAsync(e);
if (!willRaiseEvent)
ProcessConnect(e);
}
private static void ProcessConnect(SocketAsyncEventArgs e)
{
Debug.Log("ProcessConnect");
if (e.SocketError == SocketError.Success)
{
SockAsyncEventArgs.SetBuffer(buff, 0, buff.Length);
sw=true;
}
else
Debug.Log("Lost connection with " + e.RemoteEndPoint.ToString());
}
private static void SendAsync(byte[] data)
{
Debug.Log("SendAsync");
if (socket.Connected && data.Length > 0)
{
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
e.SetBuffer(data, 0, data.Length);
e.Completed += SockAsyncArgs_Completed;
bool willRaiseEvent = socket.SendAsync(e);
// Debug.Log("bytes sent: "+data.Length);
}
}
private static void ProcessSend(SocketAsyncEventArgs e)
{
Debug.Log("ProcessSend");
try
{
if (e.SocketError == SocketError.Success)
{
ReceiveAsync(SockAsyncEventArgs);
}
else
{
Debug.Log("Not sended");
}
}
catch (Exception ex)
{
Debug.Log("ProcessSend: " + ex.Message);
}
}
private static void ReceiveAsync(SocketAsyncEventArgs e)
{
Debug.Log("ReceiveAsync");
try
{
bool willRaiseEvent = socket.ReceiveAsync(e);
if (!willRaiseEvent)
ProcessReceive(e);
}
catch (Exception ex)
{
Debug.Log("ReceiveAsync: " + ex.Message);
}
}
Синтаксис:
Используется csharp
private static void ProcessReceive(SocketAsyncEventArgs e)
{
Debug.Log("PrecessReceive");
if (e.SocketError == SocketError.Success)
{
try
{
Debug.Log("receive bytes: "+e.BytesTransferred);
float x = BitConverter.ToSingle(e.Buffer,0);
float y = BitConverter.ToSingle(e.Buffer,4);
float z = BitConverter.ToSingle(e.Buffer,8);
float x_rot = BitConverter.ToSingle(e.Buffer,12);
float y_rot = BitConverter.ToSingle(e.Buffer,16);
float z_rot = BitConverter.ToSingle(e.Buffer,20);
float w_rot = BitConverter.ToSingle(e.Buffer,24);
hist.transform.position = new Vector3(x,y,z);
hist.transform.rotation = new Quaternion(x_rot,y_rot,z_rot,w_rot);
//MyTrans.BroadcastMessage("AssignNewTrans",e.Buffer);
//string s = Encoding.UTF8.GetString(e.Buffer, 0, e.BytesTransferred); //получаем идентификатор команды
//Debug.Log(s);
}
catch (Exception ex)
{
Debug.Log("ProcessReceive: " + ex.Message);//
}
}
}
private void AssignNewTrans(byte[] b)
{
Debug.Log("AssignNewTrans 1");
newTrans.position = new Vector3(
BitConverter.ToSingle(b,0),
BitConverter.ToSingle(b,4),
BitConverter.ToSingle(b,8)
);
newTrans.rotation = new Quaternion(
BitConverter.ToSingle(b,12),
BitConverter.ToSingle(b,16),
BitConverter.ToSingle(b,20),
BitConverter.ToSingle(b,24)
);
Debug.Log("AssignNewTrans 2");
Transform t = InterpolateTransform(newTrans,oldTrans,10);
AssignInterTrans(t);
}
private static Transform InterpolateTransform(Transform n, Transform o,float rate)
{
Transform t = MyTrans;
t.position=new Vector3(
Mathf.Lerp(o.position.x,n.position.x,1/rate)-o.position.x,
Mathf.Lerp(o.position.y,n.position.y,1/rate)-o.position.y,
Mathf.Lerp(o.position.z,n.position.z,1/rate)-o.position.z
);
t.rotation=new Quaternion(
Mathf.Lerp(o.rotation.x,n.rotation.x,1/rate)-o.rotation.x,
Mathf.Lerp(o.rotation.y,n.rotation.y,1/rate)-o.rotation.y,
Mathf.Lerp(o.rotation.z,n.rotation.z,1/rate)-o.rotation.z,
Mathf.Lerp(o.rotation.w,n.rotation.w,1/rate)-o.rotation.w
);
return t;
}
public void AssignInterTrans(Transform t)
{
StartCoroutine("Inter",t);
}
IEnumerator Inter(Transform t)
{
for(int i=0;i>10; i++)
{
HisTrans.position=new Vector3(
HisTrans.position.x+t.position.x,
HisTrans.position.y+t.position.y,
HisTrans.position.z+t.position.z
);
HisTrans.rotation=new Quaternion(
HisTrans.rotation.x+t.rotation.x,
HisTrans.rotation.y+t.rotation.y,
HisTrans.rotation.z+t.rotation.z,
HisTrans.rotation.w+t.rotation.w
);
yield return new WaitForSeconds(1f/10f);
}
}
void Start()
{
Debug.Log("Start");
MyTrans = me.transform;
oldTrans = he.transform;
newTrans = oldTrans;
HisTrans = he.transform;
hist=he.transform;
Init(); //подготовка соединения с сервером
Start_Connect("127.0.0.1", 9095); //соединяемся с сервером
StartCoroutine(SendFunc());
StartCoroutine(Res());
}
IEnumerator SendFunc()
{
Debug.Log("SendFunc");
while(true)
{
if(sw){
Debug.Log("send");
SendAsync(Get_Transform_Data());
}
else
Debug.Log("didnt sent");
yield return new WaitForSeconds(1);
}
}
IEnumerator Res()
{
Debug.Log("Res");
while (true)
{
try{
if (socket.Available > 0) //если пришли данные
{
/* i++;
Debug.Log("i = "+i);
SocketAsyncEventArgs SockAsyncEventArgs1 =new SocketAsyncEventArgs();
SockAsyncEventArgs1.Completed += SockAsyncArgs_Completed;*/
//Thread.Sleep(500);
ProcessSend(SockAsyncEventArgs); // получаем их
}
}
catch (Exception e)
{
Debug.Log("res: " + e.Message);
}
yield return new WaitForSeconds(Time.deltaTime);
}
}
byte[] Get_Transform_Data()
{
Debug.Log("Get_Transform_Data");
byte[] b = new byte[28];
BitConverter.GetBytes(MyTrans.position.x).CopyTo(b,0);
BitConverter.GetBytes(MyTrans.position.y).CopyTo(b,4);
BitConverter.GetBytes(MyTrans.position.z).CopyTo(b,8);
BitConverter.GetBytes(MyTrans.rotation.x).CopyTo(b,12);
BitConverter.GetBytes(MyTrans.rotation.y).CopyTo(b,16);
BitConverter.GetBytes(MyTrans.rotation.z).CopyTo(b,20);
BitConverter.GetBytes(MyTrans.rotation.w).CopyTo(b,24);
return b;
}
}
{
Debug.Log("PrecessReceive");
if (e.SocketError == SocketError.Success)
{
try
{
Debug.Log("receive bytes: "+e.BytesTransferred);
float x = BitConverter.ToSingle(e.Buffer,0);
float y = BitConverter.ToSingle(e.Buffer,4);
float z = BitConverter.ToSingle(e.Buffer,8);
float x_rot = BitConverter.ToSingle(e.Buffer,12);
float y_rot = BitConverter.ToSingle(e.Buffer,16);
float z_rot = BitConverter.ToSingle(e.Buffer,20);
float w_rot = BitConverter.ToSingle(e.Buffer,24);
hist.transform.position = new Vector3(x,y,z);
hist.transform.rotation = new Quaternion(x_rot,y_rot,z_rot,w_rot);
//MyTrans.BroadcastMessage("AssignNewTrans",e.Buffer);
//string s = Encoding.UTF8.GetString(e.Buffer, 0, e.BytesTransferred); //получаем идентификатор команды
//Debug.Log(s);
}
catch (Exception ex)
{
Debug.Log("ProcessReceive: " + ex.Message);//
}
}
}
private void AssignNewTrans(byte[] b)
{
Debug.Log("AssignNewTrans 1");
newTrans.position = new Vector3(
BitConverter.ToSingle(b,0),
BitConverter.ToSingle(b,4),
BitConverter.ToSingle(b,8)
);
newTrans.rotation = new Quaternion(
BitConverter.ToSingle(b,12),
BitConverter.ToSingle(b,16),
BitConverter.ToSingle(b,20),
BitConverter.ToSingle(b,24)
);
Debug.Log("AssignNewTrans 2");
Transform t = InterpolateTransform(newTrans,oldTrans,10);
AssignInterTrans(t);
}
private static Transform InterpolateTransform(Transform n, Transform o,float rate)
{
Transform t = MyTrans;
t.position=new Vector3(
Mathf.Lerp(o.position.x,n.position.x,1/rate)-o.position.x,
Mathf.Lerp(o.position.y,n.position.y,1/rate)-o.position.y,
Mathf.Lerp(o.position.z,n.position.z,1/rate)-o.position.z
);
t.rotation=new Quaternion(
Mathf.Lerp(o.rotation.x,n.rotation.x,1/rate)-o.rotation.x,
Mathf.Lerp(o.rotation.y,n.rotation.y,1/rate)-o.rotation.y,
Mathf.Lerp(o.rotation.z,n.rotation.z,1/rate)-o.rotation.z,
Mathf.Lerp(o.rotation.w,n.rotation.w,1/rate)-o.rotation.w
);
return t;
}
public void AssignInterTrans(Transform t)
{
StartCoroutine("Inter",t);
}
IEnumerator Inter(Transform t)
{
for(int i=0;i>10; i++)
{
HisTrans.position=new Vector3(
HisTrans.position.x+t.position.x,
HisTrans.position.y+t.position.y,
HisTrans.position.z+t.position.z
);
HisTrans.rotation=new Quaternion(
HisTrans.rotation.x+t.rotation.x,
HisTrans.rotation.y+t.rotation.y,
HisTrans.rotation.z+t.rotation.z,
HisTrans.rotation.w+t.rotation.w
);
yield return new WaitForSeconds(1f/10f);
}
}
void Start()
{
Debug.Log("Start");
MyTrans = me.transform;
oldTrans = he.transform;
newTrans = oldTrans;
HisTrans = he.transform;
hist=he.transform;
Init(); //подготовка соединения с сервером
Start_Connect("127.0.0.1", 9095); //соединяемся с сервером
StartCoroutine(SendFunc());
StartCoroutine(Res());
}
IEnumerator SendFunc()
{
Debug.Log("SendFunc");
while(true)
{
if(sw){
Debug.Log("send");
SendAsync(Get_Transform_Data());
}
else
Debug.Log("didnt sent");
yield return new WaitForSeconds(1);
}
}
IEnumerator Res()
{
Debug.Log("Res");
while (true)
{
try{
if (socket.Available > 0) //если пришли данные
{
/* i++;
Debug.Log("i = "+i);
SocketAsyncEventArgs SockAsyncEventArgs1 =new SocketAsyncEventArgs();
SockAsyncEventArgs1.Completed += SockAsyncArgs_Completed;*/
//Thread.Sleep(500);
ProcessSend(SockAsyncEventArgs); // получаем их
}
}
catch (Exception e)
{
Debug.Log("res: " + e.Message);
}
yield return new WaitForSeconds(Time.deltaTime);
}
}
byte[] Get_Transform_Data()
{
Debug.Log("Get_Transform_Data");
byte[] b = new byte[28];
BitConverter.GetBytes(MyTrans.position.x).CopyTo(b,0);
BitConverter.GetBytes(MyTrans.position.y).CopyTo(b,4);
BitConverter.GetBytes(MyTrans.position.z).CopyTo(b,8);
BitConverter.GetBytes(MyTrans.rotation.x).CopyTo(b,12);
BitConverter.GetBytes(MyTrans.rotation.y).CopyTo(b,16);
BitConverter.GetBytes(MyTrans.rotation.z).CopyTo(b,20);
BitConverter.GetBytes(MyTrans.rotation.w).CopyTo(b,24);
return b;
}
}
Это все один код, просто я проблемный метод выделил таким образом, он вначале второй части.
в чем проблема?? как решить ее? спс