Unity3D 使用Socket处理数据并将数据 在UGUI、NGUI上显示出来

Unity3d 不支持C#的线程直接调用Unity3D 主线程才能实现的功能。例如:给UGUI text 赋值、改变Color值等。怎样解决这个问题呢?使用一个Loom脚本。

按照惯例贴上代码。

首先Loom脚本

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

using System;

using System.Threading;

using System.Linq;

public class Loom : MonoBehaviour

{

public static int maxThreads = 8;

static int numThreads;

private static Loom _current;

private int _count;

public static Loom Current

{

get

{

Initialize();

return _current;

}

}

void Awake()

{

_current = this;

initialized = true;

}

static bool initialized;

static void Initialize()

{

if (!initialized)

{

if (!Application.isPlaying)

return;

initialized = true;

var g = new GameObject("Loom");

_current = g.AddComponent();

}

}

private List _actions = new List();

public struct DelayedQueueItem

{

public float time;

public System.Action action;

}

private List _delayed = new List();

List _currentDelayed = new List();

public static void QueueOnMainThread(System.Action action)

{

QueueOnMainThread(action, 0f);

}

public static void QueueOnMainThread(System.Action action, float time)

{

if (time != 0)

{

lock (Current._delayed)

{

Current._delayed.Add(new DelayedQueueItem { time = Time.time + time, action = action });

}

}

else

{

lock (Current._actions)

{

Current._actions.Add(action);

}

}

}

public static Thread RunAsync(System.Action a)

{

Initialize();

while (numThreads >= maxThreads)

{

Thread.Sleep(1);

}

Interlocked.Increment(ref numThreads);

ThreadPool.QueueUserWorkItem(RunAction, a);

return null;

}

private static void RunAction(object action)

{

try

{

((System.Action)action)();

}

catch

{

}

finally

{

Interlocked.Decrement(ref numThreads);

}

}

void OnDisable()

{

if (_current == this)

{

_current = null;

}

}

// Use this for initialization

void Start()

{

}

List _currentActions = new List();

// Update is called once per frame

void Update()

{

lock (_actions)

{

_currentActions.Clear();

_currentActions.AddRange(_actions);

_actions.Clear();

}

foreach (var a in _currentActions)

{

a();

}

lock (_delayed)

{

_currentDelayed.Clear();

_currentDelayed.AddRange(_delayed.Where(d => d.time <= Time.time));

foreach (var item in _currentDelayed)

_delayed.Remove(item);

}

foreach (var delayed in _currentDelayed)

{

delayed.action();

}

}

}

/*

* 调用案例

*/

//public class LoomUse

//{

//    void ScaleMesh(Mesh mesh, float scale)

//    {

//

//        var vertices = mesh.vertices;

//        //Run the action on a new thread

//        Loom.RunAsync(() =>

//        {

//            //Loop through the vertices

//            for (var i = 0; i < vertices.Length; i++)

//            {

//                //Scale the vertex

//                vertices[i] = vertices[i] * scale;

//            }

//            //Run some code on the main thread

//            //to update the mesh

//            Loom.QueueOnMainThread(() =>

//            {

//                //Set the vertices

//                mesh.vertices = vertices;

//                //Recalculate the bounds

//                mesh.RecalculateBounds();

//            });

//        });

//    }

//}

其次: Socket脚本

using System;

using UnityEngine;

using UnityEngine.UI;

using System.Collections;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Net.Sockets;

using System.Net;

using System.Threading;

namespace ReceiveMessage

{

class ReceiveMessage : MonoBehaviour

{

public delegate void ReceiveMes(string str);

public static event ReceiveMes receiveMes;

//在内存中开辟一块1024缓存区域

private static byte[] result = new byte[1024];

//自定义一个端口

private static int myProt = 8009;

//定义服务器 Socket 对象

private static Socket serverSocket;

private static int SencenNum = 0;

public Button mListenButton;

public Text mMainMessagetext;

private Thread MainThread;

public GameObject[] obj;

public string getInfo;

public object Wait { get; private set; }

void Start()

{

mListenButton.onClick.AddListener(ListenFunction);

}

//private void Update()

//{

//    mMainMessagetext.text = getInfo;

//}

void ListenFunction()

{

DontDestroyOnLoad(this.gameObject);

IPAddress ip = IPAddress.Parse("192.168.2.176");

serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

serverSocket.Bind(new IPEndPoint(ip, myProt));

serverSocket.Listen(10);

Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());

MainThread = new Thread(ListenClientConnect);

MainThread.Start();

}

private void ListenClientConnect()

{

while (true)

{

Socket clientSocket = serverSocket.Accept();

clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello"));

Thread receiveThread = new Thread(ReceiveMessage1);

receiveThread.Start(clientSocket);

}

}

private void ReceiveMessage1(object clientSocket)

{

Socket myClientSocket = (Socket)clientSocket;

Boolean b = true;

while (b)

{

try

{

int receiveNumber = myClientSocket.Receive(result);

string str = Encoding.UTF8.GetString(result, 0, receiveNumber);

if (str.Equals(""))

{

b = false;

}

else

{

Loom.RunAsync(() =>

{

//处理普通数据  例如:1+1,

Loom.QueueOnMainThread(() =>

                            {

                                receiveMes(str);// 调到 unity3d 主线程上

                            });

                        });

                    }

                }

                catch (Exception ex)

                {

                    Debug.Log(ex.Message);

                    myClientSocket.Shutdown(SocketShutdown.Both);

                    myClientSocket.Close();

                    break;

                }

            }

        }

    }

}

最后,UGUI 页面

using UnityEngine;

using UnityEngine.UI;

using System.Collections;

namespace ReceiveMessage

{

    public class Test : MonoBehaviour

    {

        public Text mText;


        private void OnEnable()

        {

            ReceiveMessage.receiveMes += ReceiveMes;

        }

        private void Start()

        {

            if (mText == null)

            {

                mText = GetComponent();

            }

        }

        private void OnDisable()

        {

            ReceiveMessage.receiveMes -= ReceiveMes;

        }

        private void OnDestroy()

        {

            ReceiveMessage.receiveMes -= ReceiveMes;

        }

        public void ReceiveMes(string str)

        {

            if (mText)

            {

                mText.text = str;

            }

        }

    }

}

总结,Loom是一个单例脚本,必须挂在场景中一个空物体上,不然,Loom不起作用

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容