Unity下使用c#进行UDP通信
前言
需要验证一下Unity和UDP的通信。通过Udp发送不同命令,让Unity中创建的方块前后左右移动来验证。
可以通过Unity入门教程(上)快速上手Unity。里面创建了一个方块,并添加了C#代码使方块能够跳起来。有这些入门只是就够了。不用看啰啰嗦嗦的视频是真的好(这里只是想表达如果想快速上手Unity但没空或不方便看视频的情况,这种一篇文字就能明白的干货是真棒。不排除有很多优秀视频的)。
入手了之后,还需要API查询在这里:Unity API,还是中文的。
给方块上了色,摄像机挪到了头顶,现在看起来是这个样子
代码控制
修改了下代码,现在使用键盘(WASD)可以控制前后移动。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
Rigidbody mRigidbody;
protected float mSpeed = 5f; // 速度
// Start is called before the first frame update
void Start()
{
mRigidbody = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
// 左右移动
//Store user input as a movement vector
Vector3 mInput = new Vector3(Input.GetAxis("Horizontal")*10, 0, Input.GetAxis("Vertical")*10);
//Apply the movement vector to the current position, which is
//multiplied by deltaTime and speed for a smooth MovePosition
mRigidbody.MovePosition(transform.position + mInput * Time.deltaTime * mSpeed);
}
}
现在需要做的就是,实现c# 中的UDP 客户端,收到消息后使用 MovePosition移动即可。
完整代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
public class Player : MonoBehaviour
{
Rigidbody mRigidbody;
protected float mSpeed = 25f; // 速度,决定一次的移动长度
private int port = 9000;
static Socket server;
private UdpClient client; // 客户端
private IPEndPoint remotePoint;
private Thread thread = null;
private string receiveString = null;
// Start is called before the first frame update
void Start()
{
mRigidbody = GetComponent<Rigidbody>();
// socket 配置,使用线程接收数据
remotePoint = new IPEndPoint(IPAddress.Loopback, 0);
thread = new Thread(ReceiveData);
thread.Start();
}
// Update is called once per frame
void Update()
{
if (!string.IsNullOrEmpty(receiveString))
{
char a = receiveString.ToUpper().ToCharArray()[0];
// 左右移动
int x=0, y=0;
switch (a) {
case 'W':
y = 1;
break;
case 'A':
x = -1;
break;
case 'S':
y = -1;
break;
case 'D':
x = 1;
break;
}
Vector3 mInput = new Vector3(x, 0, y);
mRigidbody.MovePosition(transform.position + mInput * Time.deltaTime * mSpeed);
receiveString = null;
}
}
private void ReceiveData()
{
while (true)
{
if (string.IsNullOrEmpty(receiveString))
{
try
{
// Setup UDP client.
client = new UdpClient(port);
// Grab the data.
byte[] data = client.Receive(ref remotePoint);
receiveString = Encoding.UTF8.GetString(data);
Debug.Log(data.Length);
client.Close();
}
catch (System.Exception e)
{
Debug.Log(e.ToString());
}
}
}
}
void OnApplicationQuit()
{
SocketQuit();
}
void OnDestroy()
{
SocketQuit();
}
// 终止线程,关闭client
void SocketQuit()
{
thread.Abort();
thread.Interrupt();
client.Close();
}
}
现在可以使用socket调试软件连接9000端口,发送 W A S D 即可控制方块前后左右移动。
参考: