C#
task
Unity
udp
Thread


はじめに

この記事はロボP Advent Calendar 2018の19日目の記事です。


やりたいこと


  • Unityで外部から座標やIDなどの司令を送ってシーンを制御したい。


  • System.Threading.Tasksを使って別スレッドで通信を受け取りたい。

  • 通信にはUDPを使う。

Taskで通信をやるのはちょっと…という声を聞きましたが、ドが付く初心者なので許してください。


準備

Unityは2017.4.15を使っています。

TaskやAsync Awaitは.NET 4.6で使える機能なのですが、Unityのデフォルトでは3.5なので変更します。

右上のEditからProject Settings > Playerをクリック。インスペクターのOther SettingsのScripting Runtime Versionを4.6にします。

unity1.PNG


コード


UDPTest.cs

using UnityEngine;

using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

public class UDPTest : MonoBehaviour
{
public int listenPort;

private UdpClient udpClient;
private IPEndPoint endPoint;

private byte[] data;
private string text;

void Start()
{
endPoint = new IPEndPoint(IPAddress.Any, listenPort);
udpClient = new UdpClient(endPoint);

// UDP受信を別スレッドで待ち受け
Task.Run(() =>
{
while (true)
{
data = udpClient.Receive(ref endPoint);
text = Encoding.ASCII.GetString(data);
}
});
}

void Update()
{
// オブジェクトを動かしたり
Debug.Log (text);
}
}


Task.Run()の中にラムダ式という記法でスレッドの処理を書いていきます。

このような別スレッドからはUnityEngineの機能(Transformとか)は使えないので注意してください。

また、今回はUDPなので使いませんでしたが、Async / Awaitを使うとデータ読み出しなど重い処理を任せたスレッドが実行完了するまでメインスレッドが待機する処理も書けます。


参考

HoloLens で UDP 通信を行う方法について調べてみた

Taskを極めろ!async/await完全攻略