软工课设第一周周四报告

姓名

张骁

时间

2016年6月30日

学习内容

    今天我对用户反映的另一个问题进行了解决。在最开始的设计阶段,我们为了游戏的整体氛围只设计了一种背景,没有考虑用户对多种背景的需要。针对这个问题,我们主要加入了两种新的风格不同的背景,使色调有所改变,

    在加入背景的过程中最大的问题就是如何使各个场景中的背景都跟着改变。由于Unity的载入单位是场景,所以更改当前场景的背景并不会影响下一个场景的背景,而我们的每一个关卡都是存储为了一个场景,这就使得更换背景变得更加困难了。原来的情况是,每一个场景中的背景都是静态的,并不会发生改变,但是现在的要求是在菜单中所做的更改要能够反映到每一个关卡当中。

    UImanager是一个单例,在整个游戏当中负责存储当前关卡等信息,在载入各个关卡时他会被保留进新的关卡当中,所以用它来储存背景信息也十分合适,但只是储存是不够的,更换背景同样重要,但是更换的时机也是一个难题。

    Unity的循环当中主要有Start和Update两个函数,Start在初始化时执行,Update在每一帧都执行。如果在每一帧都对当前背景进行检验是十分浪费资源也是没有必要的。我们希望每当载入新场景的时候检测背景是否是期望的背景,若不是则更换。但是问题在于如何抓住这个时机。如刚才所说,Start在初始化时执行,但是如前所述UImanager在各个场景之间不会被重复创建,而是会被保留进新场景中,这也就意味着它的Start不会被执行。那我们应该如何抓住这个时机呢?

    方法十分简单,虽然UImanager不会被重复创建,但是我们的主角会在每个场景中重复被初始化,这意味着它的Start函数在每次载入新场景的时候都会被执行,所以我们在主角的Start函数中调用UImanager的更新背景的函数。

    代码如下:

    void Start()

    {

        //其他代码...

        UImanager = GameObject.Find("UImanager");

        UImanager.SendMessage("syncBkg");

    }

    private void syncBkg()

    {

        GameObject bkg1 = GameObject.Find("bkg1");

        if(bkg1)

        {

            SpriteRenderer spriteRenderer

                = bkg1.GetComponent<SpriteRenderer>();

            if(spriteRenderer)

            {

                spriteRenderer.sprite = bkgS[bkg];

            }

        }

    }

    截图如下:

 

添加了新的菜单选项

 

添加了更换新背景的按钮

 

新背景能够在载入新场景时正确更新

所遇问题

目前为止还未遇到问题

解决方案

原文地址:https://www.cnblogs.com/ACskyline/p/5631441.html