Чому помилка вилітає, хоча раніше все ок було

Приф. вилітає помилка

Чому помилка вилітає, хоча раніше все ок було

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. раніше такого начебто не було. все норм працювало. сьогодні перший раз бачу цю помилку.
ось код

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 # 123;

private static Socket socket;
private static SocketAsyncEventArgs SockAsyncEventArgs; // об'єкт для асинхронної операції на сокеті

private static byte # 91; # 93; 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 # 40; # 41;
# 123;
Debug. Log # 40; "Init" # 41; ;
socket = new Socket # 40; AddressFamily. InterNetwork. SocketType. Stream. ProtocolType. Tcp # 41; ;
buff = new byte # 91; 256 # 93; ;
SockAsyncEventArgs = new SocketAsyncEventArgs # 40; # 41; ;
// підписуємося на завершення асинхронного з'єднання
SockAsyncEventArgs. Completed + = SockAsyncArgs_Completed;
# 125;


private static void SockAsyncArgs_Completed # 40; object sender, SocketAsyncEventArgs e # 41;
# 123;
Debug. Log # 40; "Completed" # 41; ;
switch # 40; e. LastOperation # 41;
# 123;
case SocketAsyncOperation. Connect.
ProcessConnect # 40; e # 41; ;
break;
case SocketAsyncOperation. Receive.
ProcessReceive # 40; e # 41; ;
break;
# 125;
# 125;

private static void Start_Connect # 40; string address, int port # 41;
# 123;
Debug. Log # 40; "Start_Connect" # 41; ;
SockAsyncEventArgs. RemoteEndPoint = new IPEndPoint # 40; IPAddress. Parse # 40; address # 41 ;. port # 41; ;
ConnectAsync # 40; SockAsyncEventArgs # 41; ;
# 125;

private static void ConnectAsync # 40; SocketAsyncEventArgs e # 41;
# 123;
Debug. Log # 40; "ConnectAsync" # 41; ;
bool willRaiseEvent = socket. ConnectAsync # 40; e # 41; ;
if # 40 ;. willRaiseEvent # 41;
ProcessConnect # 40; e # 41; ;
# 125;

private static void ProcessConnect # 40; SocketAsyncEventArgs e # 41;
# 123;
Debug. Log # 40; "ProcessConnect" # 41; ;
if # 40; e. SocketError == SocketError. Success # 41;
# 123;
SockAsyncEventArgs. SetBuffer # 40; buff, 0, buff. Length # 41; ;


# 125;
else
Debug. Log # 40; "Lost connection with" + e. RemoteEndPoint. ToString # 40; # 41; # 41; ;

private static void SendAsync # 40; byte # 91; # 93; data # 41;
# 123;
Debug. Log # 40; "SendAsync" # 41; ;
if # 40; socket. Connected data. Length> 0 # 41;
# 123;
SocketAsyncEventArgs e = new SocketAsyncEventArgs # 40; # 41; ;
e. SetBuffer # 40; data, 0, data. Length # 41; ;
e. Completed + = SockAsyncArgs_Completed;
bool willRaiseEvent = socket. SendAsync # 40; e # 41; ;
// Debug.Log ( "bytes sent:" + data.Length);
# 125;
# 125;

private static void ProcessSend # 40; SocketAsyncEventArgs e # 41;
# 123;
Debug. Log # 40; "ProcessSend" # 41; ;
try
# 123;
if # 40; e. SocketError == SocketError. Success # 41;
# 123;
ReceiveAsync # 40; SockAsyncEventArgs # 41; ;
# 125;
else
# 123;
Debug. Log # 40; "Not sended" # 41; ;
# 125;
# 125;
catch # 40; Exception ex # 41;
# 123;
Debug. Log # 40; "ProcessSend:" + ex. Message # 41; ;
# 125;
# 125;

private static void ReceiveAsync # 40; SocketAsyncEventArgs e # 41;
# 123;
Debug. Log # 40; "ReceiveAsync" # 41; ;
try
# 123;
bool willRaiseEvent = socket. ReceiveAsync # 40; e # 41; ;
if # 40 ;. willRaiseEvent # 41;
ProcessReceive # 40; e # 41; ;
# 125;
catch # 40; Exception ex # 41;
# 123;
Debug. Log # 40; "ReceiveAsync:" + ex. Message # 41; ;
# 125;
# 125;

private static void ProcessReceive # 40; SocketAsyncEventArgs e # 41;
# 123;
Debug. Log # 40; "PrecessReceive" # 41; ;

if # 40; e. SocketError == SocketError. Success # 41;
# 123;
try
# 123;
Debug. Log # 40; "Receive bytes:" + e. BytesTransferred # 41; ;

float x = BitConverter. ToSingle # 40; e. Buffer, 0 # 41; ;
float y = BitConverter. ToSingle # 40; e. Buffer, 4 # 41; ;
float z = BitConverter. ToSingle # 40; e. Buffer, 8 # 41; ;
float x_rot = BitConverter. ToSingle # 40; e. Buffer, 12 # 41; ;
float y_rot = BitConverter. ToSingle # 40; e. Buffer, 16 # 41; ;
float z_rot = BitConverter. ToSingle # 40; e. Buffer, 20 # 41; ;
float w_rot = BitConverter. ToSingle # 40; e. Buffer, 24 # 41; ;
hist. transform. position = new Vector3 # 40; x, y, z # 41; ;
hist. transform. rotation = new Quaternion # 40; x_rot, y_rot, z_rot, w_rot # 41; ;

//MyTrans.BroadcastMessage("AssignNewTrans",e.Buffer);
// string s = Encoding.UTF8.GetString (e.Buffer, 0, e.BytesTransferred); // отримуємо ідентифікатор команди
//Debug.Log(s);

# 125;
catch # 40; Exception ex # 41;
# 123;
Debug. Log # 40; "ProcessReceive:" + ex. Message # 41; ; //
# 125;

private void AssignNewTrans # 40; byte # 91; # 93; b # 41;
# 123;
Debug. Log # 40; "AssignNewTrans 1" # 41; ;
newTrans. position = new Vector3 # 40;
BitConverter. ToSingle # 40; b, 0 # 41; ,
BitConverter. ToSingle # 40; b, 4 # 41; ,
BitConverter. ToSingle # 40; b, 8 # 41;
# 41; ;
newTrans. rotation = new Quaternion # 40;
BitConverter. ToSingle # 40; b, 12 # 41; ,
BitConverter. ToSingle # 40; b, 16 # 41; ,
BitConverter. ToSingle # 40; b, 20 # 41; ,
BitConverter. ToSingle # 40; b, 24 # 41;
# 41; ;
Debug. Log # 40; "AssignNewTrans 2" # 41; ;
Transform t = InterpolateTransform # 40; newTrans, oldTrans, 10 # 41; ;
AssignInterTrans # 40; t # 41; ;


# 125;
private static Transform InterpolateTransform # 40; Transform n, Transform o, float rate # 41;
# 123;
Transform t = MyTrans;
t. position = new Vector3 # 40;
Mathf. Lerp # 40; o. position. x, n. position. x, 1 / rate # 41; - o. position. x,
Mathf. Lerp # 40; o. position. y, n. position. y, 1 / rate # 41; - o. position. y,
Mathf. Lerp # 40; o. position. z, n. position. z, 1 / rate # 41; - o. position. z
# 41; ;
t. rotation = new Quaternion # 40;
Mathf. Lerp # 40; o. rotation. x, n. rotation. x, 1 / rate # 41; - o. rotation. x,
Mathf. Lerp # 40; o. rotation. y, n. rotation. y, 1 / rate # 41; - o. rotation. y,
Mathf. Lerp # 40; o. rotation. z, n. rotation. z, 1 / rate # 41; - o. rotation. z,
Mathf. Lerp # 40; o. rotation. w, n. rotation. w, 1 / rate # 41; - o. rotation. w
# 41; ;
return t;
# 125;

public void AssignInterTrans # 40; Transform t # 41;
# 123;
StartCoroutine # 40; "Inter", t # 41; ;
# 125;

IEnumerator Inter # 40; Transform t # 41;
# 123;
for # 40; int i = 0; i> 10; i ++ # 41;
# 123;
HisTrans. position = new Vector3 # 40;
HisTrans. position. x + t. position. x,
HisTrans. position. y + t. position. y,
HisTrans. position. z + t. position. z
# 41; ;
HisTrans. rotation = new Quaternion # 40;
HisTrans. rotation. x + t. rotation. x,
HisTrans. rotation. y + t. rotation. y,
HisTrans. rotation. z + t. rotation. z,
HisTrans. rotation. w + t. rotation. w
# 41; ;
yield return new WaitForSeconds # 40; 1f / 10f # 41; ;
# 125;
# 125;

void Start # 40; # 41;
# 123;

Debug. Log # 40; "Start" # 41; ;
MyTrans = me. transform;
oldTrans = he. transform;
newTrans = oldTrans;
HisTrans = he. transform;
hist = he. transform;
Init # 40; # 41; ; // підготовка з'єднання з сервером
Start_Connect # 40; "127.0.0.1". 9095 # 41; ; // єднаємося з сервером

StartCoroutine # 40; SendFunc # 40; # 41; # 41; ;
StartCoroutine # 40; Res # 40; # 41; # 41; ;

IEnumerator SendFunc # 40; # 41;
# 123;
Debug. Log # 40; "SendFunc" # 41; ;
while # 40; true # 41;
# 123;
if # 40; sw # 41; # 123;
Debug. Log # 40; "Send" # 41; ;

SendAsync # 40; Get_Transform_Data # 40; # 41; # 41; ;

else
Debug. Log # 40; "Didnt sent" # 41; ;
yield return new WaitForSeconds # 40; 1 # 41; ;
# 125;

IEnumerator Res # 40; # 41;
# 123;
Debug. Log # 40; "Res" # 41; ;

while # 40; true # 41;
# 123;
try # 123;
if # 40; socket. Available> 0 # 41; // якщо прийшли дані
# 123;
/ * I ++;
Debug.Log ( "i =" + i);
SocketAsyncEventArgs SockAsyncEventArgs1 = new SocketAsyncEventArgs ();
SockAsyncEventArgs1.Completed + = SockAsyncArgs_Completed; * /

//Thread.Sleep(500);
ProcessSend # 40; SockAsyncEventArgs # 41; ; // отримуємо їх
# 125;

catch # 40; Exception e # 41;
# 123;
Debug. Log # 40; "Res:" + e. Message # 41; ;
# 125;
yield return new WaitForSeconds # 40; Time. deltaTime # 41; ;
# 125;


Це все один код, просто я проблемний метод виділив таким чином, він спочатку другій частині.
в чому проблема. як розв'язати цю проблему? спс

seaman писал (а): Ну так, умоглядно, розібратися не просто. Не подобаються статичні змінні і їх ініціалізація. Я б все статичне виніс з класу, успадкованих від монобехевіор, в окремий статичний клас. А далі вже думав, якщо помилка залишиться.


окей спс. спробую

seaman писал (а): Де інший потік то? Я сокети не надто знаю. Може в socket.SendAsync (e) ;? Або в подібній асинхронної функції? Інакше не зрозуміла сама помилка.
Краще б привести рядок в якій помилка і код не шматками - без розривів.

А сокет на іншому тред висить. І він з цього іншого тред намагається обробити команду, а потім змінити трансформ. юня і лається. Як варіант - можна отримані пакети складати в списочок, природно синхронізувати всі акуратно, а обробляти їх вже на Update - вибирати синхронізовано зі списку і робити процес.

Розробник Atom Fishing - Риболовля на поплавок, донку, нахлист, блешню в пост'ядерний період.
Розробник Atom Fishing II - Перша 3D MMO про риболовлю

seaman писал (а): Де інший потік то? Я сокети не надто знаю. Може в socket.SendAsync (e) ;? Або в подібній асинхронної функції? Інакше не зрозуміла сама помилка.
Краще б привести рядок в якій помилка і код не шматками - без розривів.

А сокет на іншому тред висить. І він з цього іншого тред намагається обробити команду, а потім змінити трансформ. юня і лається. Як варіант - можна отримані пакети складати в списочок, природно синхронізувати всі акуратно, а обробляти їх вже на Update - вибирати синхронізовано зі списку і робити процес.


в списочок типу List? пов значить я отримую дані від сервера, потім пхаю ці дані в public static List, а Update вилучає з цього списку Transform і застосовує до об'єкта?

слухайте, я тут запитав на одному форумі, там люди злі і нічо не пояснюють докладно, але сказали, що щоб з тред А викликати метод, який в тред Б - потрібно юзати - invoke. Поясніть плиз, як саме його юзати? а щось я знайшов клас Controle.Invoke, так воно для форм

seaman писал (а): Де інший потік то? Я сокети не надто знаю. Може в socket.SendAsync (e) ;? Або в подібній асинхронної функції? Інакше не зрозуміла сама помилка.
Краще б привести рядок в якій помилка і код не шматками - без розривів.

А сокет на іншому тред висить. І він з цього іншого тред намагається обробити команду, а потім змінити трансформ. юня і лається. Як варіант - можна отримані пакети складати в списочок, природно синхронізувати всі акуратно, а обробляти їх вже на Update - вибирати синхронізовано зі списку і робити процес.


спс чювак, я зробив так, як ти написав, і все працює XD ти найкрутіший після Кони-тян! XD

seaman писал (а): Де інший потік то? Я сокети не надто знаю. Може в socket.SendAsync (e) ;? Або в подібній асинхронної функції? Інакше не зрозуміла сама помилка.
Краще б привести рядок в якій помилка і код не шматками - без розривів.

А сокет на іншому тред висить. І він з цього іншого тред намагається обробити команду, а потім змінити трансформ. юня і лається. Як варіант - можна отримані пакети складати в списочок, природно синхронізувати всі акуратно, а обробляти їх вже на Update - вибирати синхронізовано зі списку і робити процес.


спс чювак, я зробив так, як ти написав, і все працює XD ти найкрутіший після Кони-тян! XD

Про lock не забули? А то можуть бути трабли з синхронізацією, якщо тред сокета спробує додати пакет, а головний тред якраз буде брати звідти дані.

Розробник Atom Fishing - Риболовля на поплавок, донку, нахлист, блешню в пост'ядерний період.
Розробник Atom Fishing II - Перша 3D MMO про риболовлю

seaman писал (а): Де інший потік то? Я сокети не надто знаю. Може в socket.SendAsync (e) ;? Або в подібній асинхронної функції? Інакше не зрозуміла сама помилка.
Краще б привести рядок в якій помилка і код не шматками - без розривів.

А сокет на іншому тред висить. І він з цього іншого тред намагається обробити команду, а потім змінити трансформ. юня і лається. Як варіант - можна отримані пакети складати в списочок, природно синхронізувати всі акуратно, а обробляти їх вже на Update - вибирати синхронізовано зі списку і робити процес.


спс чювак, я зробив так, як ти написав, і все працює XD ти найкрутіший після Кони-тян! XD

Про lock не забули? А то можуть бути трабли з синхронізацією, якщо тред сокета спробує додати пакет, а головний тред якраз буде брати звідти дані.


забули xD терь додам, спс

Зараз переглядають цей форум: Немає зареєстрованих користувачів і гостей 11