当前位置:主页 > 查看内容

给女朋友讲设计模式 之 GameLoop

发布时间:2021-07-14 00:00| 位朋友查看

简介:GameLoop 她从自己的房间出来,做到我的床上,我还在不断的修改我的代码,总觉得我的代码不够优雅,我最近似乎得了强迫症,她看了一会儿,问我:你要喝点水嘛? 谢谢,现在不用 那你要不要吃点什么呀? 现在不饿 你就不能多说点?一问一答的,烦死了 她说完气呼呼的回了……

GameLoop

她从自己的房间出来,做到我的床上,我还在不断的修改我的代码,总觉得我的代码不够优雅,我最近似乎得了强迫症,她看了一会儿,问我:"你要喝点水嘛?"

"谢谢,现在不用"

"那你要不要吃点什么呀?"

"现在不饿"

"你就不能多说点?一问一答的,烦死了"

她说完气呼呼的回了自己的房间,把门一摔.

我一惊,确实,晚上回来吃完饭,洗完就坐在电脑前,不陪她刷剧,星期天也不陪她逛街,也没有陪她下楼拿快递.好长时间她都是自己一个人,从来没有抱怨什么,她只是想让我多和她说说话.

我先按下Ctrl+s ,保存一下我的进度

然后拖着拖鞋,来到她的房间,发现她抱着腿坐在地毯上,小脸埋在膝盖上,我心疼极了.也陪她坐在地毯上,搂住她,抚摸着她的头发.

我说:"刚刚我在想,真实的世界是不是高级文明的游戏啊?" 她停了一下,似乎并没有预料到我会这么说,.但我知道,如果我给她讲点科幻的比直接哄她更有效.

我继续说:"我们这个世界,如果用游戏里面的话来说就是一个开放性世界,我们看到的都是模型,如果你在我身后,我快速的回头看,也许我能看到正在渲染中的你."

"你放屁,我是真的,我有自我意识,我不是AI"她连忙抬起头否认.

我说:"也许造物主把你做的这么真实就是为了欺骗我,就像西部世界里面的接待员"

她语言又止,显然她正在想怎么反驳我.

既然她想反驳我,她就一定不生气了,我就和她道歉,最近太醉心与代码重构,以至于忽略了你的感受."

我在想把游戏的所有逻辑都放在一个脚本中统一管理呢,还不知道可不可行.

她问:"为什么要这么做啊?"

我回答:"如果项目中有许多个挂载的组件,那样找起来修改太麻烦了"

"哦".她若有所思"你又把代码写乱了吧?"

"....."

自从我给她讲了讲编程知识,她就越来越聪明,而且总是能一针见血.

"对"我回答

"你想到办法了吗?"

"就是统一管理啊,把所有初始化,帧更新都放在一个名为Loop的脚本里面."

"这个听起来有点像外观模式啊"

"我给你看下我构思的样子"

说完我去房里把笔记本拿出来

"我写了几个测试的脚本"我说,"分别是一个AI,一个Enemy,还有一个Player,这些都是需要在游戏运行过程中不断的更新的"

Enemy_Scripts.cs

public class Enemy_Scripts  {

    // Use this for initialization
    public void Init () {
        Debug.Log("初始化Enemy");
    }

    // Update is called once per frame
    public void Update () {

    }
}

AI_Scripts.cs

public class AI_Scripts  {

    // Use this for initialization
    public void Init () {
        Debug.Log("初始化AI");
    }

    // Update is called once per frame
    public void Update () {

    }
}

Player_Scripts.cs

public class Player_Scripts  {

    // Use this for initialization
    public void Init () {
        Debug.Log("初始化Player");
    }

    // Update is called once per frame
    public void Update () {

    }
}

"它们后面都没有那个"她有个疑问了她应该说的是这些脚本并没有继承自Monobehaviour.

我回答:"这样它们就不用挂载了,开发的界面很简洁,通过new的方法来调用它"

然后我又写上了

Loop_Scripts.cs

public class Loop_Scripts : MonoBehaviour {

    Player_Scripts player = null;
    Enemy_Scripts enemy = null;
    AI_Scripts aI = null;

    void Init()
    {
        player = new Player_Scripts();
        enemy = new Enemy_Scripts();
        aI = new AI_Scripts();
    }

    // Use this for initialization
    void Start () {
        Init();

        player.Init();
        enemy.Init();
        aI.Init();
    }

    // Update is called once per frame
    void Update () {
        player.Update();
        enemy.Update();
        aI.Update();
    }
}

"哦,我明白你意思.你就是想把每个脚本自己可以做的事情,比如初始化,帧更新,换到这个loop脚本中用它来控制这么多的脚本中初始化和帧更新的功能对吧"

"太对了,我就是这么想的"我回答

"但是你可以把loop写成单例,然后就可以在其他地方通过单例来调用这些脚本中的方法了不是吗?"

她这一句话瞬间让我茅塞顿开,对呀,这么好的方法,真乃天女也.


本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文

  • 周排行
  • 月排行
  • 总排行

随机推荐