发一个在 Unity 中调用 Go 的示例

2020-06-29 16:27:43 +08:00
 sunny352787

https://github.com/sunny352/Example_Unity_Plugin_Go

以前写了一个 Unity 中调用 Go 插件的示例,最近在写实时战斗的时候想起来这玩意,和朋友讨论的时候觉得还是有一点用,就发出来给大家研究下

本质上是使用 cgo 暴露出 Go 写的一些接口交给 Unity 这边使用,不过限制很大,比如 Go 的 interface 什么的没有办法暴露,只能传递一些数值和字符串之类的数据,并且 Go 分配的内存是不可以进行传递的,只能传递 cgo 分配的内存。Unity 这边的 C#在进行交互的时候也是要好好控制内存,挺麻烦的,不过我写代码一向很浪,啥方案都敢尝试也基本都能玩,大家要在正式项目里使用的话还是要耐心踩坑。

2728 次点击
所在节点    游戏开发
12 条回复
paoqi2048
2020-06-29 19:11:09 +08:00
借楼问个问题:如果是 Lua 调用 Go,是不是也是通过 C 接口去桥接?或者说有什么比较成熟的解决方案?
sunny352787
2020-06-29 19:30:28 +08:00
@paoqi2048 看你用在哪里了,Go 嵌入 lua 是有现成的解决方案
hst001
2020-06-29 19:58:11 +08:00
为什么要在 unity 使用 Go?
sunny352787
2020-06-29 20:13:37 +08:00
@hst001 简单地说,好玩

复杂点解释的话,我服务器用 go 写的,有些东西想同样的放到客户端我就得再写一遍
paoqi2048
2020-06-29 21:32:29 +08:00
@sunny352787 所以说 Lua 调用 Go 现在是没什么好的轮子么?得自己造?
sunny352787
2020-06-29 22:12:11 +08:00
@paoqi2048 不太明白你想做什么,lua 调用 Go 按我理解就是 Go 的程序中嵌入一个 lua 虚拟机,写的 lua 脚本可以调用宿主的 Go 接口。如果就是 lua 虚拟机想调用 Go 写的组件,类似我这种用法的话,那就只能用 C 接口去调用了,这种应用场景可能比我 Unity 调用 Go 插件的还少吧...
Jirajine
2020-06-29 22:17:30 +08:00
没有 binding 哪个语言都不好调用,有 GC 的由于 GC 的干扰更为尤甚。
dcoder
2020-10-12 07:50:39 +08:00
@sunny352787 为什么不把 client-server 公用的代码用 C 写, 然后 client 端用 Unity C#调用 C, server 端用 cgo 调用 C ?
sunny352787
2020-10-12 11:54:22 +08:00
@dcoder 我能用 Go 写为什么要用 C 写?又多一个语言不麻烦吗?服务端该怎么写怎么写,客户端嵌进去也不费事呀
dcoder
2020-10-13 07:20:57 +08:00
@sunny352787 主要考虑客户端嵌进去 Go 是不是方便,如果客户端嵌进去 Go 非常自然原生,那就好。但是 Unity 好像是支持原生嵌进去 C/C++, 不是 Go,所以你看你其实把复杂度移入了 client (Go<->C<->Unity),而 client 一般限制更多,困难更大,不知道这样搞是不是以后潜在问题也更多.
sunny352787
2020-10-13 10:58:20 +08:00
@dcoder 挺方便的呀,我都已经丢进去了运行的也很好,使用 C 开发的话也会遇到一样的坑,具体的就是在插件中开启新线程以及各平台传递数据方式不太一样,这用什么语言都会碰到,而且本身 Go 到 C 的那部分也没有想象中那么复杂,代理部分处理好了很简单,以上这些实在搞不懂用 socket 在本地监听也不是不能用。

Go 的开发效率总归是要比 C 更高的,如果客户端和服务器都嵌入一个 C,那服务器为啥不直接用 C 写?而且使用 C 开发的话对开发人员要求也要高,一不留神就被指针坑了。
dcoder
2020-10-14 05:55:44 +08:00
@sunny352787 你说的有一定道理。我就是觉得 client (Go<->C<->Unity) 绕的弯有点长.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/685652

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX