文件夹:Server/Hotfix/Module/Console/
先推荐阅读一下ReloadConfigConsoleHandler.cs的代码
写GM指令,我是这样的:
1、Server\Model\Module\Console\ConsoleComponent
在头部先定义一个自己的标签

public const string UserTodo = “U”;
2、在Server/Hotfix/Module/Console/ 新建一个CS文件
UserTodoConsoleHandler.cs
[ConsoleHandler(ConsoleMode.UserTodo)]
public class UserTodoConsoleHandler : IConsoleHandler
{
public async ETTask Run(ModeContex contex, string content)
{
switch (content)
{
case ConsoleMode.UserTodo:
contex.Parent.RemoveComponent<ModeContex>();
break;
default:
string[] ss = content.Split(" ");
string name = ss[1];
string itemName = ss[2];
int itemCount = 1;
if (ss[3] != "") itemCount = Convert.ToInt32(ss[3]);
UnitComponent unitCom = null;
foreach (Entity e in Game.Scene.Children.Values)
{
if (e is Scene)
{
if (((Scene)e).Name == "Map1")
{
unitCom = ((Scene)e).GetComponent<UnitComponent>();
}
}
}
if (unitCom == null) return;
//ID为6的地图服务器
// Scene scene = Game.Scene.Get(StartSceneConfigCategory.Instance.Get(6).InstanceId);
foreach (Entity e in unitCom.Children.Values)
{
if (e is Unit)
{
Unit u = (Unit)e;
if (u.SubInfo.Name == name)
{
if (u.GetComponent<UserComponent>().Userdata.AddNewItem(itemName, itemCount))
{
Log.Console(itemName + " 已成功添加给" + name + itemCount.ToString());
return;
}
else
{
Log.Console(itemName + " 添加给" + name + " 失败");
return;
}
}
}
}
Log.Console(name + " 不在线");
break;
}
await ETTask.CompletedTask;
}
}
使用方法就是在服务端控制台输入:U 玩家名字 物品名 1
就会给玩家添加一个物品
如果要关服的话
1、先断开所有玩家的连接——我的UserComponent会自动储存数据,你可以自己先保存数据,再断开连接
2、保存服务器公共数据
3、终止进程
上面都是实现功能的代码,真实环境下肯定要做更严谨的处理,仅做参考