孙尚香为啥老是自动坐在刘备上面?原因竟然是这样!
今天跟大家唠唠我这几天折腾的“孙尚香自动坐在刘备上面”的事儿,听起来有点不正经,就是个游戏AI方面的实践,别想歪哈!
事情是这样的,最近在研究游戏里的角色AI,想搞点花活,让角色之间的互动更自然一点。正好手头有个三国题材的项目,就想着能不能让孙尚香在特定情况下,比如刘备受伤或者遇到危险的时候,能主动跑过去“保护”他,形象一点说,就是“自动坐在刘备上面”。
第一步:分析需求,拆解任务。要实现这个效果,得搞清楚几个关键点:
- 1、检测刘备的状态:得知道刘备是不是受伤,或者周围有没有敌人。
- 2、孙尚香的移动:让她能准确地移动到刘备身边。
- 3、动作的触发:移动到位后,播放一个“保护”或者“坐在上面”的动画。
1、刘备状态检测:
我直接用距离判断,想着孙尚香离刘备太远就触发。结果发现,这玩意儿太死板,孙尚香老是傻乎乎的,刘备稍微动一下,她就跟着跑,像个跟屁虫一样,效果贼差。
后来改用事件系统,刘备受伤或者被攻击的时候,发出一个事件,孙尚香监听这个事件。这样就好多,至少不会无脑跟着。
2、孙尚香的移动:
这个也费不少劲。直接用导航网格寻路,感觉太机械,没啥灵魂。后来试下A算法,稍微好点,但还是不够自然。我结合导航网格和一些随机的偏移量,让孙尚香的移动轨迹看起来更像人,而不是机器人。
3、动作的触发:
这个最麻烦。我直接播放一个坐下的动画,结果孙尚香直接穿模,要么坐到刘备身体里面,要么坐到旁边。试好几种方法,还是用动画状态机,根据刘备和孙尚香的距离和角度,动态切换动画。
为防止穿模,我还加碰撞检测,如果孙尚香和刘备的碰撞体发生重叠,就稍微调整一下孙尚香的位置。
第三步:不断调试,精益求精。代码写完只是第一步,后面就是无休止的调试。各种BUG,各种穿模,各种姿势不对。我花整整两天的时间,才把这个动作调整得比较自然。
比如,有时候孙尚香会直接冲到刘备面前,然后僵在那里。后来发现是导航网格的精度不够,导致寻路失败。把精度调高一点就好。
还有,有时候孙尚香会坐在刘备的头顶上,看起来非常喜感。后来发现是动画的锚点没对准,调整一下锚点的位置,总算解决。
效果展示。经过几天的努力,总算把这个功能实现。当刘备受伤或者遇到危险的时候,孙尚香会主动跑过去,然后“坐在”刘备身边,保护他。虽然看起来有点不正经,但确实提高游戏的互动性和趣味性。
这只是一个简单的DEMO,还有很多可以改进的地方。比如,可以根据不同的情况,播放不同的动画;可以增加一些额外的互动,比如孙尚香安慰刘备之类的。
这回实践让我对游戏AI有更深入的解。虽然过程很艰辛,但最终看到成果的时候,还是很有成就感的。下次再搞点更刺激的!