从零开始 - 制作一款游戏(程序员视角)

前言:

        一个从事游戏行业2年快3年的新人客户端开发,从小就喜欢玩各个平台的游戏,想从零开始制作一款游戏,此文章来分享和督促自己的整个过程。因为我也是一个新手,不懂一个正确的流程,很多基础知识也不是很熟,也不过是边巩固基础边制作,也会记录下一些问题,希望如果有大佬们看到可以给一些解答。(因为平时工作也很累的,所以坚持每天一更吧,有时候下班太晚的话,实在更不了)

搭建框架

        从GitHub下拉的一个Xlua项目:https://github.com/Tencent/xLua

学习XLua框架

        先从Example学起,看懂实例。前面01-03没有什么难度的,有开发经验的都比较好理解。

InvokeLua

        事件和委托联系,参考文章:C#中的委托和事件_c#委托和事件_Hello Bug.的博客-CSDN博客

        委托是C#中函数的指针,事件则是一种特殊签名的委托。事件只能在类内部调用。

实践: 参考文章C#中的委托和事件_c#委托和事件_Hello Bug.的博客-CSDN博客

        

using System;
 
class MainClass
{
    static void Main()
    {
        Kettle kettle = new Kettle();
        Alarm alarm = new Alarm();
        Display display = new Display();
 
        kettle.BoilEvent += alarm.Alert;          //实例化事件
        kettle.BoilEvent += display.Show;         //实例化事件
        kettle.BoilWater();
    }
}
 
public class Kettle
{
    //事件类
    public class KettleEventArgs : EventArgs
    {
        public readonly int temperature;
        public KettleEventArgs(int temperature)
        {
            this.temperature = temperature;      //记录水温
        }
    }
 
    int temperature = 96;
    public string producer = "boshi";
 
    //sender:事件触发的对象       e:事件类型
    public delegate void BoiledEventHandler(object sender, KettleEventArgs e);
    public event BoiledEventHandler BoilEvent;        //注册事件
 
    public void BoilWater()
    {
        //应该可以每个热水器注册一个事件即可。
        KettleEventArgs e = new KettleEventArgs(temperature);
        if (temperature > 95)
        {
            //KettleEventArgs e = new KettleEventArgs(temperature);
            BoilEvent(this, e);        //触发事件
        }
    }
}
 
public class Alarm
{
    public void Alert(object sender, Kettle.KettleEventArgs e)
    {
        Console.WriteLine("警告!!" + e.temperature);
    }
}
 
public class Display
{
    public void Show(object sender, Kettle.KettleEventArgs e)
    {
        Console.WriteLine("当前温度:" + e.temperature);
    }
}
————————————————
版权声明:本文为CSDN博主「Hello Bug.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/LLLLL__/article/details/100123885

        监听事件,当数据发生变化时触发事件。在项目中可以使用在当背包物品发生改变时,执行背包刷新函数,并通知不同界面进行数据刷新。

NoGC

        其实就是代码中创建的参数,在销毁代码时也把参数全部销毁,销毁的方法就是赋值为nil。实际项目中也会应用在UI预制体销毁时。

Coroutine

        创建协程,更多应用在计时器的实现上。

        协程的C#转成lua代码

-- Tencent is pleased to support the open source community by making xLua available.
-- Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
-- Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
-- http://opensource.org/licenses/MIT
-- Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

local util = require 'xlua.util'

local gameobject = CS.UnityEngine.GameObject('Coroutine_Runner')
CS.UnityEngine.Object.DontDestroyOnLoad(gameobject)
local cs_coroutine_runner = gameobject:AddComponent(typeof(CS.XLuaTest.Coroutine_Runner))

return {
    start = function(...)
		-- StartCoroutine(IEnumerator routine) , IEnumerator routine可通过util.cs_generator获取
	    return cs_coroutine_runner:StartCoroutine(util.cs_generator(...))
	end;

	stop = function(coroutine)
	    cs_coroutine_runner:StopCoroutine(coroutine)
	end
}

实例化使用

local cs_coroutine = (require 'cs_coroutine')

-- 实现一个延时2秒的计时器,并销毁
local a = cs_coroutine.start(function()
	coroutine.yield(CS.UnityEngine.WaitForSeconds(1))
	print('实现一个延时2秒的计时器')
end)

-- 实现一个每隔2秒执行一次的计时器
local b = cs_coroutine.start(function()
	while true do
		coroutine.yield(CS.UnityEngine.WaitForSeconds(2))
		print('实现一个每隔2秒执行一次的计时器')
	end
end)

-- 实现一个每隔2秒执行一次,执行3次后销毁的计时器
local num = 3		-- 执行次数
local time = 2		-- 间隔时间
local c = cs_coroutine.start(function()
	while true do
		coroutine.yield(CS.UnityEngine.WaitForSeconds(2))
		print('实现一个每隔2秒执行一次,执行3次后销毁的计时器')
	end
end)

cs_coroutine.start(function()
	coroutine.yield(CS.UnityEngine.WaitForSeconds(num * time))
	cs_coroutine.stop(c)
end)

AsyncTest

        这个例子场景我运行时会有unexpected symbol near '<\239>'报错,需要改下编码格式为UTF-8即可。

        

番外:Shader学习

        这里是想从一个系统开发转TA的记录,制作游戏和学习Shader都会边进行。

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值