HelloWorldLua - ScutGame/Scut GitHub Wiki

此章节介绍HelloWorld示例--C#脚本

通过Helloworld程序简单介绍下Scut服务端开发的流程,客户端的这里就不介绍了可以查看客户端的Lua源码。

功能概述

客户端使用Socket协议发送一个请求到服务端,服务端接收到请求后响应一段字符串给客户端,接收客户端接收到后显示出来。 序列图如下:

Hello sequence

开发流程

  • 设计接口协议

通过协议工具平台定义一个与客户端通讯的Action接口协议,Action编号为100(编号规则以3位数开始,低于3位数的Scut预留使用);

增加一个string类型,名称为content的返回参数,请求参数可以不加,如图:

contract action

在右边会自动生成服务端与客户端的通讯接口脚本,可以直接复制到项目中;

  • 创建项目

通过打开VS创建“HelloWorld”项目,详细创建参考如何搭建服务端项目工程;在Script/LuaScript/Action的目录下新建立Action100类文件;然后将协议平台生成的服务端协议脚本复制到文件中;修改如下:

#!Action100.lua

Action100 ={}

function Action100:getUrlElement(actionGetter, parent)
    local urlParam = {}
    urlParam.Result = true
    return urlParam
end

function Action100:takeAction(urlParam, parent)
    CPrint("use lua do action...")
    local actionResult = {}
    actionResult.Result = true
    actionResult._content = "Hello World for Lua!"

    return actionResult
end


function Action100:buildPacket(writer, urlParam, actionResult)
    PushIntoStack(writer, actionResult._content)

    return true
end

Lua与C#语言平台之间的调用,需要先在C#注册Lua调用函数接口,Lua才能使用已注册的接口,以下提供注册Lua调用接口示例,实际开发中需要自己再扩展;

在CsScript目录下新建ScriptProxy.cs类:

#!C#

using System;
using System.Collections;
using ZyGames.Framework.Common;
using ZyGames.Framework.Game.Service;
using ZyGames.Framework.Script;

namespace Game.Script
{
    public class ScriptProxy
    {
        public static void Load(string type, string[] files)
        {
            try
            {
                if (".cs".Equals(type))
                {
                    //注册Lua调用C#方法
                    RegistMethodd();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        public static void RegistMethodd()
        {
            ScriptProxy proxy = new ScriptProxy();
            ScriptEngines.LuaRegisterObject(proxy);
        }

        [LuaMethod("ContainsParam")]
        public bool ContainsParam(ActionGetter actionGetter, string name)
        {
            return actionGetter != null && actionGetter.Contains(name);
        }

        [LuaMethod("ReadStringParam")]
        public string ReadStringParam(ActionGetter actionGetter, string name)
        {
            return actionGetter == null ? null : actionGetter.GetStringValue(name);
        }

        [LuaMethod("ReadNumberParam")]
        public int ReadNumberParam(ActionGetter actionGetter, string name)
        {
            return actionGetter == null ? -1 : actionGetter.GetIntValue(name);
        }

        [LuaMethod("PushIntoStack")]
        public void PushIntoStack(DataStruct writer, object value)
        {
            if (value is DataStruct)
            {
                writer.PushIntoStack((DataStruct)value);
            }
            else if (value is int)
            {
                writer.PushIntoStack((int)value);
            }
            else if (value is double)
            {
                writer.PushIntoStack(value.ToInt());
            }
            else if (value is short)
            {
                writer.PushIntoStack((short)value);
            }
            else
            {
                writer.PushIntoStack(value.ToString());
            }
        }

        [LuaMethod("PushLenIntoStack")]
        public void PushLenIntoStack(DataStruct writer, object value)
        {
            var list = value as IList;
            writer.PushIntoStack(list == null ? 0 : list.Count);
        }


        [LuaMethod("CreateDataStruct")]
        public DataStruct CreateDataStruct()
        {
            return new DataStruct();
        }


        [LuaMethod("FormatDateString")]
        public string FormatDateString(DateTime value, string formart)
        {
            return value.ToString(formart);
        }

    }
}

开启使用Lua脚本,修改Config配置如下:

#!GameServer.exe.config

<add key="Script_IsDebug" value="True"/>
<add key="Lua_Disable" value="False" />

  • 启动服务并调试
  1. 服务端需要依赖的服务包括:Redis服务器;在启动服务端之前需要先启动Redis服务器,Redis服务器相当于一个数据库,一个服务端对应一个 Redis实例;如果connectionStrings节点配置为空,可以不需要Sql数据库。

  2. 按F5启动服务端,如果不能启动说明调试配置项没有配对;如果控制台没有打印出“Server has started Successfully”的字串,说明启动失败,详情需要在Nlog日志文件中查看出错信息,文件位置可以查看Nlog.config文件里的配置路径。

  3. 启动客户端,打开Sample的源码仓库Sample\HelloWorld\Client目录下的MainApp.exe,点击“Send”按键,发送请求;如果连接失败,需要检查客户端LoginScene.lua脚本配置的服务器地址是否正确;