Unity3D開發(fā)技術(shù)研究構(gòu)建框架PureMVC項(xiàng)目之炸彈人(無限通關(guān)模式)

一憔四、案例說明

本篇為PureMVC的進(jìn)階項(xiàng)目應(yīng)用牡肉,由于項(xiàng)目源碼還存在bug颗圣,完善后再分享出來利朵。

二待榔、框架視圖

三逞壁、關(guān)鍵代碼

Ctrl_EnemyMoving

/***
 * 
 *    Title: "炸彈人" 項(xiàng)目
 *           主題: 控制層--> 敵人移動(dòng)
 *    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>
        /// 是否可以移動(dòng)
        /// </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))
                {
                    //復(fù)位
                    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: "炸彈人" 項(xiàng)目
 *           主題: 控制層--> 道具
 *    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>
        /// 結(jié)束游戲
        /// </summary>
        public void StopGame()
        {
            _IsStartGame = false;
        }

        /// <summary>
        /// 觸發(fā)檢測(cè)
        /// </summary>
        /// <param name="collision"></param>
        public void OnTriggerEnter2D(Collider2D collision)
        {
            if (_IsStartGame)
            {
                if (collision.gameObject.tag==ProjectConsts.Player)
                {
                    _proxyObj.AddScores();
                }

            }
        }
    }
}

Ctrl_GetTime

/***
 * 
 *    Title: "炸彈人" 項(xiàng)目
 *           主題: 控制層--> 得到時(shí)間
 *    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()
        {
            //得到模型層類的對(duì)象實(shí)例
            //dataProxy = Facade.Instance.RetrieveProxy(Model_GameDataProxy.NAME) as Model_GameDataProxy;
            IsStartGame = true;
        }

        /// <summary>
        /// 游戲結(jié)束
        /// </summary>
        public void StopGame()
        {
            IsStartGame = false;
        }


        void Start () {
            //得到模型層類的對(duì)象實(shí)例
            dataProxy = Facade.Instance.RetrieveProxy(Model_GameDataProxy.NAME) as Model_GameDataProxy;
            //啟動(dòng)協(xié)程流济,每隔一秒種,往PureMVC 模型層發(fā)送一條消息腌闯。
            StartCoroutine("GetTime");
        }

        /// <summary>
        /// 協(xié)程绳瘟,得到時(shí)間
        /// </summary>
        /// <returns></returns>
        private IEnumerator GetTime()
        {
            yield return new WaitForEndOfFrame();
            while (true)
            {
                yield return new WaitForSeconds(1F);
                if (dataProxy != null && IsStartGame)
                {
                    //調(diào)用(Mediator)模型層方法
                    dataProxy.AddGameTime();
                }
            }

        }



    }
}

四、效果展示

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載姿骏,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者糖声。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市分瘦,隨后出現(xiàn)的幾起案子蘸泻,更是在濱河造成了極大的恐慌,老刑警劉巖嘲玫,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悦施,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡去团,警方通過查閱死者的電腦和手機(jī)抡诞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渗勘,“玉大人沐绒,你說我怎么就攤上這事俩莽⊥梗” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵扮超,是天一觀的道長(zhǎng)取刃。 經(jīng)常有香客問我,道長(zhǎng)出刷,這世上最難降的妖魔是什么璧疗? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮馁龟,結(jié)果婚禮上崩侠,老公的妹妹穿的比我還像新娘。我一直安慰自己坷檩,他們只是感情好却音,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著矢炼,像睡著了一般系瓢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上句灌,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天夷陋,我揣著相機(jī)與錄音,去河邊找鬼。 笑死骗绕,一個(gè)胖子當(dāng)著我的面吹牛藐窄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酬土,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼枷邪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了诺凡?” 一聲冷哼從身側(cè)響起东揣,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腹泌,沒想到半個(gè)月后嘶卧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凉袱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年芥吟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片专甩。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钟鸵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涤躲,到底是詐尸還是另有隱情棺耍,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布种樱,位于F島的核電站蒙袍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嫩挤。R本人自食惡果不足惜害幅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岂昭。 院中可真熱鬧以现,春花似錦、人聲如沸约啊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棍苹。三九已至无宿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枢里,已是汗流浹背孽鸡。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工蹂午, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彬碱。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓豆胸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親巷疼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晚胡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容