前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >魔兽世界插件-镜头控制器编写思路

魔兽世界插件-镜头控制器编写思路

作者头像
ChildhoodAndy
发布2022-12-20 16:19:00
6200
发布2022-12-20 16:19:00
举报
文章被收录于专栏:小菜与老鸟小菜与老鸟

背景

很早之前,大概今年 3 月多份吧,一个朋友微信找到我,问我是否能帮忙做一个魔兽世界插件,能够方便他录制沉浸感的视频。

我答应了下来,但没有说具体什么时候做完。拖到了现在,有了点时间,花了一个周末,研究了下插件的编写规则,经过查阅官方的 API 文档,反复测试,算是完成了。

此篇文章主要用来分享下这个插件的编写思路。

一、背景知识

魔兽世界插件的编写语言是 Lua,Lua这门脚本语言非常小巧,很早之前创业做游戏的时候,使用的是 quick-cocos2d,便是使用的 lua 语言基于 cocos2d 来编写游戏,实现原型和效果非常快速。

这门语言和 C、C++ 语言交互非常方便,可以很容易实现互相调用,被开发者称之为“胶水语言”,非常自然而言的成为了魔兽世界这个游戏扩展脚本的专用语言。而魔兽世界中的宏也有很多是基于 lua 来实现的。

顺便值得一提的是,魔兽世界公开了很多 API,这些 API 涉及到了公会、战场、竞技场、副本Raid、任务、专业、幻化、拍卖行等等,这也是魔兽世界这个游戏插件如此丰富的原因。

PS:个人觉得,插件扩展是人类的一个非常伟大的思想。很多软件提供了接口,而有了这些接口,全世界范围内的开发者都可以基于这些接口开发插件,提供到插件社区,来供所有人使用。就拿 VSCode 来说,提供了 VSCode 插件扩展 API,海量的插件使得 VSCode 如虎添翼。

想象一下,无论是 VSCode 还是魔兽世界,本身提供的功能,本身就不可能满足所有人的需求,正是插件体系的强大之处,借助开源的力量,才使得功能边界得到了极大的延伸。

二、镜头的控制

在做这个镜头控制的时候,我在想,为什么有这样的需求?Bilibili 以及抖音上很多魔兽世界的玩家会分享一些在游戏里面探索的视频,玩家们会使用录屏工具进行游戏的录制,但是在录制的时候,隐藏 UI 界面元素之后,用鼠标控制游戏内摄像头的角度,以及镜头拉远拉近都会出现强烈的抖动感,究其原因是鼠标的移动或者滚轮的视角远近滚动都不是恒速的,速度上会忽快忽慢,造成视频的观感并不是很好。

想象一下,无论是 VSCode 还是魔兽世界,本身提供的功能,本身就不可能满足所有人的需求,正是插件体系的强大之处,借助开源的力量,才使得功能边界得到了极大的延伸。

魔兽世界的 API 查询网站

https://wowpedia.fandom.com/wiki/World_of_Warcraft_API

我们想要的镜头控制,包含了以下控制:

1)镜头的拉近

2)镜头的拉远

3)镜头的左摇

4)镜头的右摇

5)镜头的上摇

6)镜头的下摇

另外为了营造无人浏览效果,还可以对角色自身进行隐藏,以及在一些雨雪天,我们可以加强天气效果,造成大雪纷飞、大雨滂沱的效果等等。

镜头控制的函数主要如下:

代码语言:javascript
复制
MoveViewInStart(speed) - Begins zooming the camera in.
MoveViewInStop() - Stops zooming the camera in after #MoveViewInStart() is called.

MoveViewOutStart(speed) - Begins zooming the camera out.
MoveViewOutStop() - Stops zooming the camera out after #MoveViewOutStart() is called.

MoveViewLeftStart(speed) - Begins rotating the camera to the Left.
MoveViewLeftStop() - Stops rotating the camera after #MoveViewLeftStart() is called.

MoveViewRightStart(speed) - Begins rotating the camera to the Right.
MoveViewRightStop() - Stops rotating the camera after #MoveViewRightStart() is called.

MoveViewUpStart(speed) - Begins rotating the camera upward.
MoveViewUpStop() - Stops rotating the camera after #MoveViewUpStart() is called.

MoveViewDownStart(speed) - Begins rotating the camera downward.
MoveViewDownStop() - Stops rotating the camera after #MoveViewDownStart() is called.

在插件进行控制时候,我这边只要控制好镜头的一些互斥关系就好了,比如不能同时左摇和右摇,上摇和下摇,拉远和拉近,它们两两是互斥的。所以在 UI 的操作逻辑上,我这边会让互斥的效果先停掉。例如,如果镜头正在拉近,那么点击拉远的时候,会先停止镜头的拉近,再开启镜头的拉远,通过调整 slider 滑动条的数值,可以很方便地实时控制镜头的速度。

角色自身的显示和天气效果的控制,是通过修改游戏暴露的 CVar 变量来实现的,这个着实费了我一些时间,最终通过控制台执行的方式解决了。

代码语言:javascript
复制
# 角色的显示隐藏控制
if __checked then
  ConsoleExec("showPlayer 1")
else
  ConsoleExec("showPlayer 0")
end

# 天气密度的控制
local function OnWeatherDensityValueChanged(slider ,value)
  local intValue = math.floor(value)
  _G[slider:GetName() .. 'Text']:SetText("天气效果:" .. intValue)
  ConsoleExec("weatherDensity " .. intValue)
  ConsoleExec("RAIDweatherDensity " .. intValue)
end

三、开源

该插件已经开源

https://github.com/dabing1022/ChildhoodAndyWowAddOns。

下载下来后,放到游戏中的 Interface/AddOns 文件夹,使用的时候通过 /cc 命令便可调出镜头控制面板。

希望这个插件能够帮助那些遨游在艾泽拉斯的小伙伴们,通过镜头的完美控制,录制出满意的视频效果。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小菜与老鸟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 一、背景知识
  • 二、镜头的控制
  • 三、开源
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档