婆罗门
精华
|
战斗力 鹅
|
回帖 0
注册时间 2012-1-30
|
这个东西按说功能挺强的,作者也一直在更新。但是就是哪儿都不见讨论。
最近摸索了一个大概,写了一个简单的介绍,有没有同好来一起摸索这个东西。
需要基本的python了解。
文章如下
VNGE这玩意其实功能还是有点强的,只是不知道为啥,到处都看不到讨论,但是更新又很多。各种基于SSB和SSSB的制作也不少。关于偏代码方向的讨论还真不多。
其代码核心位于BepInEx下的Plugins/Console/Lib中
其中主要有三个组件 VNFrame VNActor和VNAnime, 这三个组件都是python文件。Console这个插件应该是直接给Unity框架开的口子,本身游戏运行时打开的Console,除了显示加载信息错误信息,也可以输入python函数,让Python可以直接和游戏进程中的对象交互。
其他各种SSB SSSB,SceneUtils都基于或者大部分基于这三个组件所提供的功能。
VNFrame提供基本框架,可以调用游戏中的多数系统级别的功能。
VNActor提供人物和道具的操作。
VNAnime提供一个动画框架,可以实现基于关键帧的动画,并且导出为Json。
基本介绍就是如此,下面是基本操作。
_____________________________________________________________________
这玩意儿在游戏里的热键就是Ctrl+F3和Ctrl+F8
建立VNGE新游戏的时候
在NeoStudio中,先Ctrl+F8叫出界面。
然后Clip Man—> Scene Helper->new python 建立游戏
game name 自己起,game folder要在UserData/Studio/scene下预先建立,
png名字自己起,python名字也是自己起。
执行成功之后,会在UserData/Studio/scene下面自己起的game folder下看到一个自己起名字的png,也就是场景存档
同时在BepInEx/Plugins/Console/Lib 下面看到一个按照自己起名字的py文件。这就是自己的游戏代码文件了。
同目录下的simplegamedemoavg.py, techdemo.py, vnftut_neo.py是一些作者提供的例子。
建立好的游戏在Ctrl+F8唤出的VNGE主界面中的All games可以找到。同时也可以运行作者提供的例子游戏。
还要注意在编辑场景png的时候,需要在scene helper里,选save scene来保存修改,否则alt+S会在UserData/Studio/scene下存一个新的,保存时候需要写gamefolder\游戏.png
----------------------------------------------------------------------------------------------------------------
用VNGE写游戏的基本流程就是在场景png里添加人物和道具
在python脚本里实现逻辑和对话。
在场景添加人物(char)和道具(prop)之后,在scene helper里选create tag,这一步就是起一个名字,在python中可以用这个名字来调用这个道具或者人物,实际上是在这个东西下面加了一个节点。加载游戏的时候会注册。任何修改都需要保存在png中,这样启动游戏的时候才能起作用,并且找到这个物体。
游戏会给你一个基本的代码框架,基本是一系列以game为参数的函数,这些函数可以互相跳来跳去。其中对话部分的代码非常简单,看一下例子就能了解。
其他的一些需要摸索的有。
基本代码有获得人物
act=game.scenef_get_all_actors()['g1'] ##g1是tag时候给人物的名字。
获得人物之后,就可以用VNActor里的方法和人物交互。
从json加载某个pose。这个不分ik或者fk。
看json例子就知道
pose1="""{"pose": {"hands": {"list": [1, 1], "__tuple__": true}, "fk_active": {"list": [false, false, false, false, false, false, false], "__tuple__": true}, "fk_set": {"10000": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.309, "w": 0.951}, "10001": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.161, "w": 0.987}, "10002": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.304, "w": 0.953}, "10003": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.154, "w": 0.988}, "10004": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.254, "w": 0.967}, "10005": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.241, "w": 0.971}, "10006": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.304, "w": 0.953}, "10007": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.212, "w": 0.977}, "10008": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.292, "w": 0.957}, "10009": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.269, "w": 0.963}, "10010": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.154, "w": 0.988}, "10011": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.214, "w": 0.977}, "10012": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.244, "w": 0.970}, "10013": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.170, "w": 0.986}, "10014": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.164, "w": 0.986}, "10015": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.116, "w": 0.993}, "10016": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.000, "w": 1.000}, "10017": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.381, "w": 0.924}, "10018": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.158, "w": 0.987}, "10019": {"z": 0.000, "__Quat__": true, "y": 0.000, "x": 0.000, "w": 1.000}}, "rotate_to": {"z": -0.000, "y": 0.000, "__Vector3__": true, "x": -0.000}, "anim_lp": false, "kinematic": 1, "ik_set": {"cf_J_LegLow01_L": {"list": [{"z": -5.286, "y": 2.778, "__Vector3__": true, "x": -2.877}], "__tuple__": true}, "cf_J_ArmUp00_R": {"list": [{"z": 2.594, "y": 2.161, "__Vector3__": true, "x": 1.187}], "__tuple__": true}, "cf_J_LegUp00_R": {"list": [{"z": -1.481, "y": 0.863, "__Vector3__": true, "x": 0.803}], "__tuple__": true}, "cf_J_Hand_L": {"list": [{"z": -1.691, "y": 2.281, "__Vector3__": true, "x": -0.324}, {"z": -0.000, "__Quat__": true, "y": 0.718, "x": -0.000, "w": -0.696}], "__tuple__": true}, "cf_J_ArmUp00_L": {"list": [{"z": 2.548, "y": 2.077, "__Vector3__": true, "x": -1.187}], "__tuple__": true}, "cf_J_Hand_R": {"list": [{"z": -1.744, "y": 2.283, "__Vector3__": true, "x": 0.220}, {"z": -0.001, "__Quat__": true, "y": -0.707, "x": 0.001, "w": -0.708}], "__tuple__": true}, "cf_J_Hips": {"list": [{"z": 0.000, "y": 0.741, "__Vector3__": true, "x": 0.000}], "__tuple__": true}, "cf_J_LegUp00_L": {"list": [{"z": -1.481, "y": 0.863, "__Vector3__": true, "x": -0.803}], "__tuple__": true}, "cf_J_Foot01_L": {"list": [{"z": -3.585, "y": 4.144, "__Vector3__": true, "x": 0.069}, {"z": 0.101, "__Quat__": true, "y": 0.498, "x": -0.861, "w": 0.027}], "__tuple__": true}, "cf_J_Foot01_R": {"list": [{"z": -3.113, "y": 4.031, "__Vector3__": true, "x": -0.156}, {"z": -0.024, "__Quat__": true, "y": -0.399, "x": -0.903, "w": 0.161}], "__tuple__": true}, "cf_J_ArmLow01_R": {"list": [{"z": -0.128, "y": 3.273, "__Vector3__": true, "x": 0.298}], "__tuple__": true}, "cf_J_LegLow01_R": {"list": [{"z": -5.293, "y": 3.862, "__Vector3__": true, "x": 2.161}], "__tuple__": true}, "cf_J_ArmLow01_L": {"list": [{"z": -0.178, "y": 3.106, "__Vector3__": true, "x": -0.509}], "__tuple__": true}}, "ik_active": {"list": [true, true, true, true, true], "__tuple__": true}, "anim_spd": 0.000, "face_to": 4, "anim": {"list": [0, 1, 17, 0.000], "__tuple__": true}, "anim_ptn": 0.000}, "tags": ["Base"]}"""
active中已经指定了那些ik或者fk是激活状态,可以同时起效。
加载时需要用反序列化器,然后才能应用于人物
from libjsoncoder import sceneDecoder
res = json.loads(pose, object_hook = sceneDecoder)
act.import_status(res['pose'])
镜头操作则是
game.move_camera(pos=(0.0,23, 0.0), distance=(0, 0,-27.0), rotate=(16.0, 196.0, 0), fov=23.0)
pos是镜头位置,distance是偏移量,rotate是旋转角度,fov是可视范围。
|
|