Unity实现I社游戏人物卡功能

您所在的位置:网站首页 ai少女角色卡怎么读取 Unity实现I社游戏人物卡功能

Unity实现I社游戏人物卡功能

2024-06-28 21:26| 来源: 网络整理| 查看: 265

I社新出的游戏如AI少女和Honey Select 2 等很多都有人物卡,可以把捏好的老婆弄成一张以截屏为封面的PNG,在不压缩等处理图片的情况下,把图片放到指定位置,游戏就可以读取图片并把图片里的老婆放到游戏里了。

我没有对AI少女等有人物卡的游戏解包啊什么的,所以我不知道原游戏具体方法是什么(虽然网上好像已经有直接修改人物卡属性的脚本了)。这里只是把我的对于这个功能的想法做出来了。假如有大佬有更好的方法、意见和建议,欢迎指出。

完全复刻游戏人物卡功能的话太复杂了,本人技术有限,这里只把字符串插入图片,然后Unity再读取图片并把字符串打印出来。以后有机会的话再填坑把完整的人物卡功能做出来吧。

思路和方向

Unity应该是有有关图像处理等功能的插件的,照理应该会有我想要的功能,但我没有找到,所以就自己写了。

既然要自己写,那就想好程序的思路吧:

截取游戏屏幕选定区域,生成图片

将“Hello, World!”字符串转成ASCII码值,按3个字符为一组的形式分组,并以此作为每个像素中RGB的值。然后将每个RGB作为像素块替换到图片里部分像素块。(肉眼看不出和原图的区别)

把图片变PNG格式的文件本地存储

获取本地图片,读取想要的像素块,将像素块的RGB储存起来,转化为字符串,打印到控制台。

具体步骤

在Unity界面里:

在项目(Project)窗口里新建个Render Texture,我这里命名为picture,将它的Size参数设置为128*128,Size参数影响到后边读取数据,读取图片的Size要和这里一样。

新建Render Texture

设置Size

在主摄像机下添加以一个摄像机,将刚才创建的Render Texture放入到相机的Taget Texture(可以在Hierarchy窗口下右键->UI->Raw Image,然后把创建的Render Texture拖到Raw Image里的Texture,就可以预览相机拍摄的画面)

Render Texture文件拖到Camera的Taget Texture

在摄像机下新建脚本(不是主摄像机)。

开始码代码:

由于刚开始的第一帧才刚开始渲染,所以我们要等下一帧才开始我们图像处理,这里用协程

等待一帧后再开始我们的操作。

start里开启协程

新建个Texture2D对象,大小是Render Texture的长宽。

RenderTexture.active是当前处于活动状态的渲染纹理

将Texture2D设置游戏截屏的图片

Texture2D.ReadPiexls是截图,人物卡就是截游戏做封面的,这里我们也一样用unity自带的截图方法。

设置字符串,变成Byte数组。

将我们想要的字符串变成byte编码的整数。

用Texture2D.SetPixel方法设置像素块。

将字符串里3个字符为一组,分别放到Color的RGB里,并把他们输出成图片

下面面这张图可以更好的解释字符串是怎么分配的。

Output函数是在协程外面的方法,只是输出PNG文件而已,之前为了多种测试,所以多弄了个Output方法。

记得在Assets里兴建文件夹叫Resources,不然unity会报错说找不到文件夹。

为了比较编码是否改变了,我写了下面这个方法,控制台查看byte编码是多少。

现在你点Unity的运行,应该会有一张叫m_output2.png图片生成出来,如图。

可能要切出去Unity再进来Unity才会把图片加载进来。

在Unity界面里:

要对Unity里图片设置一下,我们才能处理图片。

红色就是要按的地方

选图片,在Inspector窗口,勾选可读写,代码里才能获取这张图。再将图片Max Size设置我们一开始的128大小,读取的像素块才会和我们放进去的一样。Format设置为RGBA 32 bit才能正确读取我们像素块RGBA值,其他Format选项我没全试过,只知道RGBA 32 bit才可以。记得按Apply应用设置。

回到代码:

我们就可以加载图片了,这里我选择用Resources加载。

加[ContextMenu("ReadImage")]后,可以不用运行直接在挂载到GameObject上的脚本组件右键运行函数。点组件左上角3个点的按钮也行

字符串"Hello, World!"有13个字符,我们Byte数组就设置为13个。读出RGB复制到我们数组里,把数组转成字符串就是我们要的结果了。

我测试发现Encoding.Default.GetBytes()和Encoding.ASCII.GetBytes()结果一样。.GetString()也是同理。

Debug.log打印字符串可以看到结果。

结果和开始时的一样

自此,我们的程序就完成啦~~ 

不过我觉得我这实现方法挺笨的,如果有大佬有好的方法、意见和建议欢迎在评论区指出~~ 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3