记得以前看到过一些UE demo,使用手机或者便携式设备,上面几个按钮,操控一个大屏幕上UE4的场景,给场景中车辆、角色换装等等。
因为最近再玩树莓派,所以就想到了在UE4中远程操作树莓派,两个都是无线,那么通过socket连接去控制,这个方法不止可以控制树莓派,可以控制任何单片机,同时还可以实现手机控制PC或者其他设备。
UE4商店里有很多socket连接的插件,这里我使用了python的socket去操作。文章最后放上所有源代码和插件下载地址。
先看下效果:
https://www.zhihu.com/video/1132793691764596736
思路就是,python中2个文件一个为客户端,跑在UE4中,一个服务端跑在树莓派上,首先是服务端代码:
import socket
import time
import sys
import RPi.GPIO as GPIO
HOST_IP = "192.168.0.103"
HOST_PORT = 5858
print("启动TCP服务...")
socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("监听IP%s:%d!" %(HOST_IP, HOST_PORT) )
host_addr = (HOST_IP, HOST_PORT)
socket_tcp.bind(host_addr)
socket_tcp.listen(1)
socket_con, (client_ip, client_port) = socket_tcp.accept()
print("连接客户端IP地址%s." %client_ip)
socket_con.send("服务器启动成功!!!")
GPIO.setmode(GPIO.BCM)
GPIO.setup(3,GPIO.OUT)
print("Receiving package...")
while True:
try:
data=socket_con.recv(512)
if len(data)>0:
print("Received:%s"%data)
if data.decode() =='1':
GPIO.output(3,GPIO.HIGH)
elif data.decode() =='0':
GPIO.output(3,GPIO.LOW)
socket_con.send(data)
time.sleep(1)
continue
except Exception:
socket_tcp.close()
sys.exit(1)
紧接着是客户端代码:
import socket
import time
import sys
SERVER_IP = "192.168.0.103"
SERVER_PORT = 5858
Server_addr = (SERVER_IP, SERVER_PORT)
print("启动socketTCP连接...")
socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("成功!")
while True:
try:
print("正在连接服务器%s:%d..." %(SERVER_IP, SERVER_PORT))
socket_tcp.connect(Server_addr)
print("连接成功!")
break
except Exception:
print("服务器断开连接,尝试重新连接!")
time.sleep(1)
continue
print("操作内容:")
while True:
try:
data = socket_tcp.recv(512)
if len(data)>0:
#print("Received: %s" % data)
#command = raw_input()
str = '1'
socket_tcp.send(str.encode())
time.sleep(1)
continue
except Exception:
socket_tcp.close()
socket_tcp=None
sys.exit(1)
使用的话将对应的GPIO改掉,包括IP和端口号。
另外要注意的是,上面的客户端代码,是使用本地py脚本的,UE4中操作如下所示:
首先在游戏开的时候,启动一段python代码,这段代码首先是创建socket连接,并且连接到服务器,如果连接成功,则显示连接成功,如果连接失败,每隔1秒进行重新连接,一直到返回true。这里一开始启动代码主要是连接服务器的,接下来看第二段python:
第二段python其实可以和上面的合在一起,无所谓都可以,上面如果连接成功到服务器后,这里需要对服务器返回的消息进行接收,也就是recv,如果看服务器代码,可以看到如果连接成功后,会返回一个欢迎消息,那么这里recv作为接收端,需要接受来自服务器的返回。
接下来都一样了,我使用Red颜色作为说明,在UE4中一共2个button,他们分别像服务器发送一个数据,这个数据必须要进行字符转换,这里使用.send语法像服务器发送数据,如果我们看服务器的代码,服务器在检测客户端有连接请求并且连接成功后,会进入一个循环接受来自客户端的send消息,并且decode转码。
写在最后,插件使用了UnrealEnginePython,如果想要增加新的python版本,需要增加UnrealEnginePythonandroidarmeabi-v7a下的python编译文件,以及UnrealEnginePythonandroid目录下对应新建版本的include文件夹,同时需要去python对应版本目录下压缩libs到stdlib压缩包中。
最后附上地址,使用UE422开发,先启动服务器,再启动客户端,2个python源文件再PythonPiTCPPython目录下,UE4的客户端代码一个在关卡蓝图,一个在UMG蓝图。
需要各位再手动再编译下插件,因为插件编译完太大了,不好上传,所以把缓存删了。
链接:https://pan.baidu.com/s/1i4yxbkE5FLUS4uqkXFLZww
提取码:igcc