如果要模拟多人游戏情况,建议是装一个 VMware 虚拟环境,
然后往 VM 中安装一个 XP系统,在虚拟环境中启动另一个 KF1 游戏程序。
提前说明:进 VMware 在命令窗口不知道退出时,请输入 shutdown
第一次使用 VMware 时,将克服一下问题:
-
安装 VMware,并找个序列号激活
-
到 BIOS 启动 CPU 虚拟化,解决 “Intel VT-x 处于禁用状态”问题
-
下载并安装 XP 系统到 VM 中
-
虚拟XP系统中安装 VMtools 工具
-
设置 VM 共享文件夹
-
将 KF1 通过共享文件夹,复制到 虚拟XP系统中
这个过程对于初学者来说一个挑战 但也是一劳永逸的;
有了虚拟机 就可以一个人测试“多人游戏”,并不是谁都有时间来一起调试。
准备就绪之后,原桌面启动游戏,再到 VM中启动一个游戏
建议测试用破解版,将插件编译后的内容 复制过去;
目标为 system 文件夹,将编译插件生成的 .u 和 .ucl 文件扔过去
但是VM虚拟机中的 KF1 就不需要复制mod包了,因为进房时 会加载缓存。
给函数加上模拟关键字,即可实现客户端对该函数的执行。
前提该类已设置好了“网络所有权”,表示客户端能感知到 插件对象的存在。
defaultproperties
{
RemoteRole=ROLE_SimulatedProxy
bAlwaysRelevant=true
bAddToServerPackages=true
}
示例代码,给以前写过的函数加上 simulated 模拟关键字
// 游戏开始之后
simulated function PostBeginPlay()
{
SetTimer(5, false);
}
// 计时器
simulated function Timer()
{
local PlayerController PC;
PC = Level.GetLocalPlayerController();
if (PC != none)
PC.Player.Console.Message("Hello World!", 0);
}
以上代码在能在“客户端”进入房间5秒后执行;
即 多开游戏进行测试,能发现两边都能执行到该函数。
请注意观察 上述两个函数都加了 simulated 关键字
如果把 simulated 关键字去掉,将只有房主端能看到输出,
客户端则看不到输出内容(~波浪键,控制台窗口)
在插件中关于玩家出生的函数 ModifyPlayer() 可以不加模拟关键字,
因为玩家每次出生都直接在“服务端”进行处理,并不需要客户端 再次处理。
小提示:
-
如果模拟函数调用了非模拟函数,非模拟函数将不会在客户端执行。
-
加了 final 或 native 关键字的函数,也能在客户端执行,不过这两种关键字另有用途。
实际上并没有只在客户端执行的函数,只是可以通过“条件判断”来排除服务器端的执行
请记住:条件判断一般是写在函数体里面
// 判断网络模式 不是“专用服务器”
if (Level.NetMode != NM_DedicatedServer)
{
// 这里的代码,只在客户端执行
}
从机翻来看 就是关卡的网络模式 不等于 专用服务器时,就表示仅客户端执行;
有了这种代码,我们可以在客户端做出不一样的效果
simulated function PostBeginPlay()
{
if (Level.NetMode != NM_DedicatedServer)
class'KFChar.ZombieClot'.default.AmbientGlow = 255;
}
clot 是杀地板中最低级的白皮怪,属性 AmbientGlow 表示“环境辉光”
代码效果为:客户端将看见带闪烁皮肤的 clot怪
根据条件判断,服务器端将不执行该效果
由于篇幅有点长,下次再详细讨论一下网络游戏中的变量复制