Unity3D开发技术研究构建框架PureMVC项目之炸弹人(无限通关模式)

一、案例说明

本篇为PureMVC的进阶项目应用,由于项目源码还存在bug,完善后再分享出来。

二、框架视图

三、关键代码

Ctrl_EnemyMoving

/***
 * 
 *    Title: "炸弹人" 项目
 *           主题: 控制层--> 敌人移动
 *    Description: 
 *           功能:
 *                  
 *    Date: 2021.6.2
 *    Version: 0.1版本
 *    Modify Recoder: 
 *    
 *   
 */
using System.Collections;
using System.Collections.Generic;
using SUIFW;
using UnityEngine;

namespace PureMVCDemo
{
    public class Ctrl_EnemyMoving : MonoBehaviour
    {
        private float speed = 0.04f;
        private Rigidbody2D rig;
        private SpriteRenderer spriteRenderer;
        private Color color;
        /// <summary>
        /// 方向:0上 1下 2左 3右
        /// </summary>
        private int dirId = 0;
        private Vector2 dirVector;
        private float rayDistance = 0.7f;
        /// <summary>
        /// 是否可以移动
        /// </summary>
        private bool canMove = true;

        private void Awake()
        {
            spriteRenderer = GetComponent<SpriteRenderer>();
            color = spriteRenderer.color;
            rig = GetComponent<Rigidbody2D>();
        }
        /// <summary>
        /// 初始化方法
        /// </summary>
        public void Init()
        {
            color.a = 1;
            spriteRenderer.color = color;
            canMove = true;
            InitDir(Random.Range(0, 4));
        }
        private void InitDir(int dir)
        {
            dirId = dir;
            switch (dirId)
            {
                case 0:
                    dirVector = Vector2.up;
                    break;
                case 1:
                    dirVector = Vector2.down;
                    break;
                case 2:
                    dirVector = Vector2.left;
                    break;
                case 3:
                    dirVector = Vector2.right;
                    break;
                default:
                    break;
            }
        }
        private void Update()
        {
            if (canMove)
                rig.MovePosition((Vector2)transform.position + dirVector * speed);
            else
            {
                ChangeDir();
            }
        }
        private void OnTriggerEnter2D(Collider2D collision)
        {
            //消灭敌人
            if (collision.CompareTag(Tags.BombEffect) && gameObject.activeSelf)
            {
                GameController.Instance.enemyCount--;
                ObjectPool.Instance.Add(ObjectType.Enemy, gameObject);
            }
            if (collision.CompareTag(Tags.Enemy))
            {
                color.a = 0.3f;
                spriteRenderer.color = color;
            }
            if (canMove)
                if (collision.CompareTag(Tags.SuperWall) || collision.CompareTag(Tags.Wall))
                {
                    //复位
                    transform.position = new Vector2(Mathf.RoundToInt(transform.position.x),
                        Mathf.RoundToInt(transform.position.y));
                    ChangeDir();
                }
        }
        private void OnTriggerStay2D(Collider2D collision)
        {
            if (collision.CompareTag(Tags.Enemy))
            {
                color.a = 0.3f;
                spriteRenderer.color = color;
            }
        }
        private void OnTriggerExit2D(Collider2D collision)
        {
            if (collision.CompareTag(Tags.Enemy))
            {
                color.a = 1;
                spriteRenderer.color = color;
            }
        }
        private void ChangeDir()
        {
            List<int> dirList = new List<int>();
            if (Physics2D.Raycast(transform.position, Vector2.up, rayDistance, 1 << 8) == false)
            {
                dirList.Add(0);
            }
            if (Physics2D.Raycast(transform.position, Vector2.down, rayDistance, 1 << 8) == false)
            {
                dirList.Add(1);
            }
            if (Physics2D.Raycast(transform.position, Vector2.left, rayDistance, 1 << 8) == false)
            {
                dirList.Add(2);
            }
            if (Physics2D.Raycast(transform.position, Vector2.right, rayDistance, 1 << 8) == false)
            {
                dirList.Add(3);
            }
            if (dirList.Count > 0)
            {
                canMove = true;
                int index = Random.Range(0, dirList.Count);
                InitDir(dirList[index]);
            }
            else canMove = false;
        }
        private void OnDrawGizmos()
        {
            Gizmos.color = Color.red;
            Gizmos.DrawLine(transform.position, transform.position + new Vector3(0, rayDistance, 0));
            Gizmos.color = Color.blue;
            Gizmos.DrawLine(transform.position, transform.position + new Vector3(0, -rayDistance, 0));
            Gizmos.DrawLine(transform.position, transform.position + new Vector3(-rayDistance, 0, 0));
            Gizmos.DrawLine(transform.position, transform.position + new Vector3(rayDistance, 0, 0));
        }
    }
}

Ctrl_Prop

/***
 * 
 *    Title: "炸弹人" 项目
 *           主题: 控制层--> 道具
 *    Description: 
 *           功能:
 *                  
 *    Date: 2021.6.2
 *    Version: 0.1版本
 *    Modify Recoder: 
 *    
 *   
 */
using System.Collections;
using System.Collections.Generic;
using PureMVC.Patterns;
using UnityEngine;

namespace PureMVCDemo
{
    public class Ctrl_Prop : MonoBehaviour {
        //模型代理
        private Model_GameDataProxy _proxyObj;  
        //是否开始
        private bool _IsStartGame = false;



        /// <summary>
        /// 开始游戏
        /// </summary>
        public void StartGame()
        {
            _proxyObj = Facade.Instance.RetrieveProxy(Model_GameDataProxy.NAME) as Model_GameDataProxy;
            //开始游戏
            _IsStartGame = true;
        }

        /// <summary>
        /// 结束游戏
        /// </summary>
        public void StopGame()
        {
            _IsStartGame = false;
        }

        /// <summary>
        /// 触发检测
        /// </summary>
        /// <param name="collision"></param>
        public void OnTriggerEnter2D(Collider2D collision)
        {
            if (_IsStartGame)
            {
                if (collision.gameObject.tag==ProjectConsts.Player)
                {
                    _proxyObj.AddScores();
                }

            }
        }
    }
}

Ctrl_GetTime

/***
 * 
 *    Title: "炸弹人" 项目
 *           主题: 控制层--> 得到时间
 *    Description: 
 *           功能:
 *                  
 *    Date: 2021.6.2
 *    Version: 0.1版本
 *    Modify Recoder: 
 *    
 *   
 */
using System.Collections;
using System.Collections.Generic;
using PureMVC.Patterns;
using UnityEngine;

namespace PureMVCDemo
{
    public class Ctrl_GetTime : MonoBehaviour {
        //模型代理
        public Model_GameDataProxy dataProxy = null;
        //游戏是否开始
        private bool IsStartGame = false;


        /// <summary>
        /// 游戏开始
        /// </summary>
        public void StartGame()
        {
            //得到模型层类的对象实例
            //dataProxy = Facade.Instance.RetrieveProxy(Model_GameDataProxy.NAME) as Model_GameDataProxy;
            IsStartGame = true;
        }

        /// <summary>
        /// 游戏结束
        /// </summary>
        public void StopGame()
        {
            IsStartGame = false;
        }


        void Start () {
            //得到模型层类的对象实例
            dataProxy = Facade.Instance.RetrieveProxy(Model_GameDataProxy.NAME) as Model_GameDataProxy;
            //启动协程,每隔一秒种,往PureMVC 模型层发送一条消息。
            StartCoroutine("GetTime");
        }

        /// <summary>
        /// 协程,得到时间
        /// </summary>
        /// <returns></returns>
        private IEnumerator GetTime()
        {
            yield return new WaitForEndOfFrame();
            while (true)
            {
                yield return new WaitForSeconds(1F);
                if (dataProxy != null && IsStartGame)
                {
                    //调用(Mediator)模型层方法
                    dataProxy.AddGameTime();
                }
            }

        }



    }
}

四、效果展示

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容