游戏开发之Unity学习(五)——鼠标打飞碟(Hit UFO)

一、游戏内容要求:

  • 游戏有 n 个 round,每个 round 都包括10 次 trial;
  • 每个 trial 的飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。它们由该 round 的 ruler 控制;
  • 每个 trial 的飞碟有随机性,总体难度随 round 上升;
  • 鼠标点中得分,得分规则按色彩、大小、速度不同计算,规则可自由设定。

二、游戏的要求:

  • 使用带缓存的工厂模式管理不同飞碟的生产与回收,该工厂必须是场景单实例的!
  • 使用 MVC 结构实现人机交互与游戏模型分离

三、游戏的实现

这里写图片描述
之前的几个博客已经构建好了一个较为完整的MVC框架,这里可以套用之前的框架。看上面的UML图就能了解到
游戏结构和上一个游戏基本没有不同,仅仅添加了一个飞碟工厂!!!
其实不加这个也可以实现这一个游戏,但是为什么要加上这个飞碟工厂呢?
这是因为加上对象的构建和销毁都是很耗资源的,这个工厂能够让我们有效的利用已经构造好的游戏对象来实现资源的重利用,从而减少资源开销
那么,先看看这个工厂是如何实现的:

using System.Collections.Generic;
using UnityEngine;

public class DiskFactory : MonoBehaviour {
    public List<GameObject> used = new List<GameObject>();
    public List<GameObject> free = new List<GameObject>();

    // Use this for initialization
    void Start () { }

    public void GenDisk()
    {
        GameObject disk;
        if(free.Count == 0)
        {
            disk = Instantiate<GameObject>(Resources.Load<GameObject>("Prefabs/Disk"), Vector3.zero, Quaternion.identity);
        }
        else
        {
            disk = free[0];
            free.RemoveAt(0);
        }
        float x = Random.Range(-10.0f, 10.0f);
        disk.transform.position = new Vector3(x, 0, 0);
        disk.transform.Rotate(new Vector3(x < 0? -x*9 : x*9, 0, 0));
        float r = Random.Range(0f, 1f);
        float g = Random.Range(0f, 1f);
        float b = Random.Range(0f, 1f);
        Color color = new Color(r, g, b);
        disk.transform.GetComponent<Renderer>().material.color = color;
        used.Add(disk);
    }
    public void RecycleDisk(GameObject obj)
    {
        obj.transform.position = Vector3.zero;
        free.Add(obj);
    }
}

这里的used和free分别表示已经在使用的和未被利用的飞碟对象,如果free的列表为空,而我们有需要它,这时才创建新的对象,不然,就用之前的。好了,这就是飞碟工厂,然后我们看场景控制器如何利用这个工厂。

using UnityEngine;
using UnityEngine.SceneManagement;

public class FirstSceneController : MonoBehaviour, IUserAction, ISceneController{
    public CCActionManager actionManager;
    public GameObject disk;
    protected DiskFactory df;
    public int flag = 0;
    private float interval = 3;
    public int score = 0;
    public static int times = 0;

    private void Awake()
    {
        SSDirector director = SSDirector.getInstance();
        director.setFPS(60);
        director.currentSceneController = this;
        this.gameObject.AddComponent<DiskFactory>();
        this.gameObject.AddComponent<CCActionManager>();
        this.gameObject.AddComponent<UserGUI>();
        df = Singleton<DiskFactory>.Instance;
        //director.currentSceneController.GenGameObjects();
    }
    private void Start()
    {
    }
    public void GenGameObjects ()
    {
    }
    public void Restart()
    {
        SceneManager.LoadScene("1");
    }
    public void Pause ()
    {
        actionManager.Pause();
    }
    public void Update()
    {
        if (times < 30 && flag == 0)
        {
            if (interval <= 0)
            {
                interval = Random.Range(3, 5);
                times++;
                df.GenDisk();
            }
            interval -= Time.deltaTime;
        }
    }
}

场景控制器是需要重写的一个类,因为它是游戏对象生成的,显然之前的场景控制器在这里完全用不上当然由于之前MVC架构的分离作用,这里也仅需要改Awake,Update,GenGameObject这三个函数和各种变量。
然后动作管理器是需要重写动作的,而动作在这里需要的改动较小,只需要改MoveToAction就行了,不过为了更好的控制飞碟,这里的动作将变成一个列表,这是为了能够同时控制多个飞碟在游戏中飞行。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CCActionManager : SSActionManager, ISSActionCallback {
    public FirstSceneController sceneController;
    public List<CCMoveToAction> seq = new List<CCMoveToAction>();
    public UserClickAction userClickAction;
    public DiskFactory disks;

    protected new void Start()
    {
        sceneController = (FirstSceneController)SSDirector.getInstance().currentSceneController;
        sceneController.actionManager = this;
        disks = Singleton<DiskFactory>.Instance;
    }
    protected new void Update()
    {
        if(disks.used.Count > 0)
        {
            GameObject disk = disks.used[0];
            float x = Random.Range(-10, 10);
            CCMoveToAction moveToAction = CCMoveToAction.GetSSAction(new Vector3(x, 12, 0), 3 * (Mathf.CeilToInt(FirstSceneController.times / 10) + 1) * Time.deltaTime);
            seq.Add(moveToAction);
            this.RunAction(disk, moveToAction, this);
            disks.used.RemoveAt(0);
        }
        if (Input.GetMouseButtonDown(0) && sceneController.flag == 0)
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitGameObject;
            if (Physics.Raycast(ray, out hitGameObject))
            {
                GameObject gameObject = hitGameObject.collider.gameObject;
                if (gameObject.tag == "disk")
                {
                    foreach(var k in seq)
                    {
                        if (k.gameObject == gameObject)
                            k.transform.position = k.target;
                    }
                    userClickAction = UserClickAction.GetSSAction();
                    this.RunAction(gameObject, userClickAction, this);
                }
            }
        }
        base.Update();
    }
    public void SSActionEvent(SSAction source, SSActionEventType events = SSActionEventType.Completed, int intParam = 0, string strParam = null, Object objParam = null)
    {
        disks.RecycleDisk(source.gameObject);
        seq.Remove(source as CCMoveToAction);
        source.destory = true;
        if (FirstSceneController.times >= 30)
            sceneController.flag = 1;
    }
    public void CheckEvent(SSAction source, SSActionEventType events = SSActionEventType.Completed, int intParam = 0, string strParam = null, Object objParam = null)
    {
    }
    public void Pause()
    {
        if(sceneController.flag == 0)
        {
            foreach (var k in seq)
            {
                k.enable = false;
            }
            sceneController.flag = 2;
        }
        else if(sceneController.flag == 2)
        {
            foreach (var k in seq)
            {
                k.enable = true;
            }
            sceneController.flag = 0;
        }
    }
}

这里需要改动的也只有那几个函数:Update,SSActionEvent,Pause函数,另外几个类的改动更小,基本就改了一两行代码,在这里就不说了。如果对那些改动感兴趣的话,可以去文章末尾的链接看看。
下面说说用户GUI:

using UnityEngine;

public class UserGUI : MonoBehaviour {

    private FirstSceneController action;
    private GUIStyle fontstyle1 = new GUIStyle();
    // Use this for initialization
    void Start () {
        action = SSDirector.getInstance().currentSceneController as FirstSceneController;
        fontstyle1.fontSize = 50;
    }

    // Update is called once per frame
    private void OnGUI()
    {
        if (GUI.Button(new Rect(0, 80, 80, 60), "RESTART"))
        {
            action.Restart();
        }
        if (GUI.Button(new Rect(0, 160, 80, 60), "Pause"))
        {
            action.Pause();
        }
        if (action.flag == 0)
        {
            fontstyle1.normal.textColor = Color.green;
            GUI.Label(new Rect(Screen.width / 2 - 150, 0, 300, 100), "Score: " +
                action.score + ", Round: " + (Mathf.CeilToInt(FirstSceneController.times / 10) + 1), fontstyle1);
        }
        else if (action.flag == 1)
        {
            fontstyle1.normal.textColor = Color.red;
            GUI.Label(new Rect(Screen.width / 2 - 150, 0, 300, 100), "Your score is : " + action.score, fontstyle1);
        }
        else
        {
            fontstyle1.normal.textColor = Color.green;
            GUI.Label(new Rect(Screen.width / 2 - 150, 0, 300, 100), "Score: " +
                action.score + ", Round: " + (Mathf.CeilToInt(FirstSceneController.times / 10) + 1), fontstyle1);
            fontstyle1.normal.textColor = Color.red;
            GUI.Label(new Rect(Screen.width / 2 - 150, Screen.height/2-50, 300, 100), "Pause!", fontstyle1);
        }
    }
}

这本身就是一个很简单的类,应该不难看懂,因此仅贴上代码。游戏效果图如下(没下什么资源,所以界面有点难看)
这里写图片描述

更多更详细的内容请戳:github

阅读更多

UFO飞碟原理(上)

04-22

第一篇rnrnUFO飞碟原理rn许世传 E-mail: hsc1937@163.comrn网址 http://www.sea3000.net/xushichuan rn万有引力的实质(PDF):http://gsjournal.net/files/4506_shichuan.pdfrnrn【摘要】 用万有引力成因诠释UFO原理[0]. 本文用[正反一次筛]创新型数论,阐明正反物质粒子相遇产生耦合强度 激发爆炸湮灭时,使部分能量嬗变为新物质,孪生出形影相随的等量带负能量的反物质,与其他所有普通物质发生交叉的异性吸引力,就是万有引力;施以相应产生正、反物质耦合常数 的临界电磁强度,就能使该正物质脱耦失去反物质, 即失去引力, 物质就不存在重力及惯性力,该物质就能在宇宙飘浮、随意移动的功能! 就能制造UFO飞船,并赋予反物质的保护罩★。rnrn【关键词】 [正反一次筛];物质是能量的结晶体;反物质;“反物质”是“宇宙基因”。rnrnrn前 言rnrn1、飞碟自古有之 苏东坡在扬州古庙寄宿,看见长江上空有物如星辰般发亮,旋即消失。古人称“宝盖”、“黄珠”。 玛雅文化中,外星人的踪影都隐约可见。在浙江德清考古发现,一枚陶片竟有一个类似天线头盔的人物形象、俄罗斯小教堂的壁画,耶稣出现于一个熊熊燃烧的飞行器上……猿人跟类人猿有脱节,这突变是如何发生的至今成谜。或是在外星人的帮助下,两者发生关系,从而创造今天人类文明。rn始于1878年1月,当时美国德克萨斯州一个农民在田间劳动时,看见空中有一个圆盘状的物体在飞行。当时飞机还没有问世,这一奇特的现象在报纸上发表后,引起了社会的轰动。rnrn2、UFO飞碟客观存在性rnUFO八卦网站宣称,美国国防部「先进研究计划总署」已经承认,总统欧巴马将在一项演说中脱稿间接承认,外星人可能试图联络地球人,而且各国政府在3年内会直接承认,地球人和外星人已有接触。rn上海市西部1990-1999年出现“U”字形和“鱼”或“梭子”形UFO★★;这4起事件至今科学无法解释。 rn rn2011.5.15美国媒体曝光:“中国成功迫降一个UFO”。…“追踪到了中国重庆市附近的一个地区,通过高分辨率卫星在那儿发现了一个被帆布覆盖大半的直径60英尺的圆形金属物★★★。…证明外星科技已对中共解密,他们的军工科技未来将飞跃性的进步,各项科技空白将不再阻碍中国在全球的称霸图谋。”麦克唐纳德建议:“在提高太空防御能力的同时,美国政府应加强与中国的沟通与合作。” 中国空军近日秘密迫降一艘飞碟rn__________________________________rn★ 这飞行物的反物质保护罩,一遇到反物质并被“和蔼融解”掉,使飞行物恢复原形为普通物质堕落近旁星球的殒星!rn★★ 首个记录:1987.8.27 桔红色、圆形、高空、顺时针旋转. “4大经典”至今无法解释。参见ufo探索网:http://www.ttufo.com/ufo/201108/787.htmlrn★★★ 阅读提示:目前当局极力对外封锁消息,据推测不排除是外星人飞船被中国迫降,飞行器上估计无生物生还。美方对此事件感到担忧和沮丧,毫无疑问UFO的外壳合金工艺以及推进装置原理...rnrn美最大军火供应商前主管本•里奇临终前确认外星UFO★: (1)有两种型号UFO。一个是我们造,一个是“它们”造。我们 从“它们”坠毁的零件和残骸中学习技术。rn(2) 几乎所有的“生物形态”航空航天设计都是受到了罗斯威尔飞船的启发,从SR-71黑鸟侦察机到如今的无人侦察机,无人战斗机以及太空飞行器等等。rn(3.)本•里奇不让公众关于“UFO和外星人”的信息。他们无法接受。…我们已经拥有了‘送我们去外星’的技术。洛克希德工程师承包商承认:UFO是真的★★.rn飞碟残骸1974年,一架飞碟在罗斯托大州的顿涅茨克市附近爆炸,发现飞碟残骸,经化验分析确认,该飞碟残片是由铈、镧及其他尚不确知的化学元素组成的合金制造的。是来自“仲湟尔”行星的外星飞行器。rn螺旋光环 1981年7月 南京中科院紫金山天文台每年收到大量浩如烟海报告。1981.7.24十分典型。大半个中国都有目击者;且无法用现有的科学原理解释.rn3、中国近期发生多起不明飞行物事件 空中怪车1994年贵州贵阳凌晨3时,都溪林场职工、居民被轰隆隆的响声惊醒,目击红色和绿色强光的不明物体呼啸而过,有大风。400多亩松林被拦腰截断。相距5公里贵州铁道部车辆厂严重破坏。…50吨重的火车车厢位移20余米远。rn4. 发光“海绵”2007.7.17凌晨3时,江苏常州市一个神秘发光体从天降落在欧凯公司大门内,监控器清晰地拍摄到了不明白色发光体画面,圆桌大小。3时23分,光球变不规则状,底部“伸”出两个突起,像一块不规则的海绵蹦跳着向东“逃”去。26分前后,光球缩小成保龄球大小,“蹦”进监控探头范围内。保安查看,光球像有所觉察,四处跳动,越变越小,“躲”着保安。在保安室停留3分消失。rn5、访问地球的UFO类型 依照目击案例可由大小分类如下:rn (1)超小型无人探测机:直径30公分左右较多。大的飞碟会飞进房屋内;标准大小UFO情况居多,无外星人,通为球型或圆舟型;rn (2)小型侦察机:直径在1到5公尺左右飞碟着陆,并由飞碟中走出外星人,在降落点周围进行各项调查。rn (3)标准型联络船:直径在7到10公尺以上,以圆盘型较多,像最常见的UFO,可能是外太空及地面调查的飞碟互相联络用,地球人被绑架到飞碟的事件,也几乎都是此型飞碟的杰作。rn(4)大型母船:直径由几百公尺到几千公尺以上飞碟,以圆筒型及圆盘型居多。由几千公尺到1至2万公尺高度被看到的情况较多,降落在地面的目击案例则没有。rnrn————————————————rn★ 阿波罗登月时,尼尔•阿姆斯特朗说:“这些UFO很巨大,它们可以急停,并且做60°,45°,10°转弯,然后立即做反向飞行”…,我们和政府签署了保密协议。反重力研究的工作正在进行中。1947年我们在罗斯威尔捕获了一个飞船,这是真的。确实我们从中获得了一些技术,将技术付诸应用。我们掩盖、藏起来。军方提供的关键技术是绝对不是我们所能研发的,毫无疑问外星生命是存在的rn★★ 来自:觉醒字幕组www.awaker.net 详细地址:http://www.awaker.net/a/kejiwenming/2011/0813/2665.htmlrn6、美国51区 深处沙漠建于地下,据透露,有外星人遗体、飞碟遗骸陈列其中。有关UFO的报道中,甚至有提到一架在前苏联失事的飞碟有外星人的小孩,发现时尚未断气。后来因环境不适,没有抢救过来。rn不信请看:http://v.youku.com/v_show/id_XMjc5NTY3ODU2.htmlrnrn7、佛经的轮回学说 按佛经上说,前一文明历劫而死,后一文明历劫而生,劫毁、劫成,世界是在这一循环中往复。第一个文明之前已经有过好几个文明存在过,近来考古学上的发现足以证明这一点,我们这一文明只是在以前的文明毁灭以后繁衍起来;甚至人类认为,秘鲁等地发现的麦田圈即是外星人发给地球的信号,只是凭借人类目前的智慧,尚不能解答而已。rnrn8. 不信UFO请看 资讯频道rn• 点看视频:实拍:加拿大恐怖UFO云rn• 点看视频:最清晰ufo rn• 点看视频:两架喷气式战斗机护航的不明飞行物rn• 点看视频:苏州街头惊现无声十字形UFOrn• 点看视频:俄罗斯上空惊现十字型发光体rn• 点看视频:UFO入侵地球事件曝光rn• 点看视频:解密美国是怎么通过ufo支配太空的rn• 点看视频:首次发现外星人尸体rn• 点看视频:不明飞行物现身 大小如同地球rn• 点看视频:2011年9月27日,太阳旁边的不明物rn• 点看视频:最高机密!俄罗斯飞碟反重力技术!rn• 点看视频:难辨真假:希腊机场巨型UFO着陆rn• 点看视频:海地惊现不明飞行物UFOrn• 点看视频:点看视频:2009年最佳不明飞行物视频:三角形UFO 瞬间消失rn• 点看视频:点看视频:2011-10-05 07:14:18湖北随州炎帝神农像上空惊现UFO_ 齐鲁网新闻中心rn• 点看视频:最新罗斯威尔飞碟坠毁现外星人幸存者视频曝光-在线观看-科教视频-... rn• 点看视频:从google卫星照片上看到的25幅诡异图案rn• 点看视频:老外实拍的史上最大的UFO_外星探索网rn• 点看视频:巨型UFO近距离实拍 rn• 点看视频:海地的巨型UFO -视频- 优酷视频- 在线观看rn• 点看视频:UFO 母舰 LIGHT SHIPS(超规模超...rn• 点看视频:經典UFO、外星人原始視頻 rn• 点看视频:寻找地外文明 - 视频豆单合集 - 土豆网 rn• 点看视频:【探索空间】环宇搜秘之‘幽...rn• 点看视频:Nasa机密泄露:月球大型UFO与基地rn• 点看视频:外星人踪迹卫星照片rn• 点看视频:[电科学超人] 尼古拉•特斯拉 (上) 尼古拉•特斯拉(下)rn• rn• rn• rn• 01:53rn• 8.25 游客在秘鲁拍摄到 UFOrn• 19,000rn• rn• rn• rn• 00:37rn• 超清晰UFO视频rn• 7,475rn• rn• rn• rn• 00:14rn• 超清晰实拍UFO(3)rnrn9. 视频:《了解宇宙如何运行》rn第1集:恒星-科教视频在线观看视频下载-56网视频rnwww.56.com/u61/v_NjE2NTg4MzQ.html2011年7月5日 - 44 分钟rn第2集:黑洞_在线视频观看_土豆网视频《了解宇宙 ...rnwww.tudou.com/programs/.../ivru_hgBrA...2011年7月1日 - 44 分钟rn第3集:大爆炸_在线视频观看_土豆网视频了解 ...rnwww.tudou.com/.../view/8gI3YwqzPWc/2011年7月7日 - 44 分钟rn第四集:星系- HERSPrnres.hersp.com/content/1191181 - 网页快照rn第5集:太阳系rnwww.360doc.com/content/11/.../535885_131759804.shtml - 网页快照rn第6集:行星-科教视频在线观看视频下载-56网视频rnwww.56.com › 科教 - 网页快照rn第7集:卫星_360P》 - 开心网转帖- 开心网rnwww.kaixin001.com/repaste/59365695_5621927224.html - 网页快照rn第8集超新星rnwww.jandan5.com/bn/tn_33656-0-7.html - 网页快照《了解宇宙如何运行》央视版全集rnwww.360doc.com/content/11/.../7261337_160494784.sht... - 网页快照rn2011年10月31日 – 《了解宇宙如何运行》央视版全集. ... 《了解宇宙如何运行》第3.rnrn2011年12月,将出现全球最著名的外星人事件,? 1星的编队到达美国51区,讨论全球灾难应对事件,美国总统和国防部长等秘密出席会议,事后联合国要求美国公布谈判视频。rnrnrn10. 图片rnrnrnrnrnrnrnrnrnrnrnrnrnrnrnrnrnrnrnrnrnrnrnrn rn视频:真实的混血型小灰人发现死在西西里岛的madonie山里 截图rn罗斯威尔的幸存者 - 视频 - 优酷视频 - 在线观看rnrnrnrnrnrnrnrnrnrnrnrnrnrnrn   rn  内容简介rn  (根据原英文电子版1-18页内容摘要概括如下)rn   搞者插图rn  rnrnrnrn11. 地外科技文明rn比地球要先进数30亿年以上,如UFO就是个例子.....它是以最快数十几倍的超光速,也可控制其速度变慢小于光速,在宇宙星系间飞行....我分析UFO就是个地外智慧生命的,在宇宙中广泛存在的暗物质,反物质,取之不尽,用之不完的能源和能量的转换飞行器...rn星际深空飞行,主要是在火箭把探测飞行器脱离地球引力后,送入宇宙星际飞行轨道后,能否利用在在宇宙中广泛存在的暗物质,反物质,取之不尽,用之不完的能源和高能量粒子,进行能量转换飞行?地外智彗生命的UFO,就可能是利用其宇宙中的某些物质能量进行星际,星系飞行的……rnrn螺旋星系磁场催生恒星(图片来源:Thomas V. Davis)rn德国海德尔堡市马普学会天文学研究所的天文学家Hua-bai Li和Thomas Henning发现,位于M33的6个最大型分子云中的磁场与螺旋星系的旋臂排列在一起,这些分子云是由密集的气体与尘埃构成的大型浓缩物,能够形成恒星。这一发现意味着这些磁场能够帮助形成巨大的云团,并且控制这些云团碎片形成新的恒星。 rn M33螺旋星系磁场可形成恒星rnrn天文学家拍到最年轻超新星照片rn美国每日科学网站11月24日报道:天文学家为刚爆发的最年轻超新星拍照。天文学家得到了一张前所未有的最年轻超新星的射电天文学照片。今年6月,在涡状星系(M 51星系)中的一颗恒星爆发14天后,欧洲各地的望远镜合作为这场宇宙中的爆炸拍摄了一张非常清晰的照片———相当于能看到月球表面的一个高尔夫球。rn其清晰度甚于哈勃太空望远镜100倍。(来源:新华网) rn 最年轻超新星照片rnrnrn

没有更多推荐了,返回首页