1. 程式人生 > >[Unity3D課堂作業] 改進版:Priests and Devils 牧師與惡魔

[Unity3D課堂作業] 改進版:Priests and Devils 牧師與惡魔

還是先po一下效果咯~~


這次作業其實就是:將上次作業在Update()函式一幀幀改位置控制運動,改為類似cocos2d的一個Action方法控制物體自己運動,也就是所謂的面向物件的設計。但其實本質上還是在每一幀的時間裡做改動。

課件上面那個設計框架基本上可以plug and play 即插即用,所以就直接套過來用了,只需要在CCActionManager處與上次作業的mainSceneController互動即可


(課件截圖)

因此修改後的專案UML類圖如下(CCActionManager那裡即與上圖連線


由於在上次作業我都是在控制船運動的BoatBehaviour和控制人物運動的PersonStatus裡修改位置,所以這次也只需要主要在這兩個腳本里修改即可,很方便。

下面說一下與之前作業修改的地方:

1、新增interface介面IAddAction,有兩個方法:增加單獨動作和組合動作

public interface IAddAction {
    void addSingleMoving(GameObject sourceObj, Vector3 target, float speed);
    void addCombinedMoving(GameObject sourceObj, Vector3[] target, float[] speed);
}

2、在mainSceneController裡實現IAddAction介面方法。但在這之前先把CCActionManager宣告為其一個私有成員,並在CCActionManager裡真正實現addSingleMoving()、addCombinedMoving()兩個方法:

public void addSingleMoving(GameObject sourceObj, Vector3 target, float speed) {
    this.runAction(sourceObj, CCMoveToAction.CreateSSAction(target, speed), this);
}

public void addCombinedMoving(GameObject sourceObj, Vector3[] target, float[] speed) {
    List<SSAction> acList = new List<SSAction>();
    for (int i = 0; i < target.Length; i++) {
        acList.Add(CCMoveToAction.CreateSSAction(target[i], speed[i]));
    }
    CCSequeneActions MoveSeq = CCSequeneActions.CreateSSAction(acList);
    this.runAction(sourceObj, MoveSeq, this);
}
    而mainSceneController裡實現IAddAction介面方法僅僅是通過CCActionManager私有成員呼叫自身的兩個方法即可。

3、明顯動作結束後會回撥CCActionManager裡面的SSActionEvent方法。所以需要在此回撥函式裡面告知mainSceneController動作(船/人)已經完成:

public void SSActionEvent(SSAction source, SSActionEventType eventType = SSActionEventType.Completed, int intParam = 0, string strParam = null, object objParam = null) {
    if (source.gameObject.name.Equals("Boat")) {   //船完成動作
        scene.boatReachBank();
    }
    else {   //人完成動作
        scene.personFinishMoving();
    }
}

4、新增動作的基本框架大概就做好了,只需要在控制船和人的腳本里呼叫即可

5、BoatBehaviour指令碼

    (1)之前是在此指令碼的Update()方法裡一幀幀的改位置,這次去掉

    (2)之前是通過GenGameObjects呼叫BoatBehaviour的setBoatMove方法觸發船移動。因此只需修改setBoatMove方法,把原來 直接更改位置變成:

addAction.addSingleMoving(this.gameObject, LOCATION_SET.boat_right_LOC, BOAT_SPEED);

6、PersonStatus指令碼:

    在這裡由於人要上下船,所以移動會有兩次,如先向上再向右。此時只需找到中間轉折點的位置,將兩個動作作為序列動作即可。以下為分解動作並新增的方法:

void divideThePosAndSetMove(Vector3 target, bool isGetOn) {
    Vector3[] dividedPos = new Vector3[2];
    float[] speedSet = new float[2];

    if (isGetOn) {
        dividedPos[0] = new Vector3(target.x, this.transform.position.y, 0);
        dividedPos[1] = target;
    }
    else {
        dividedPos[0] = new Vector3(this.transform.position.x, target.y, 0);
        dividedPos[1] = target;
    }

    speedSet[0] = PERSON_SPEED;
    speedSet[1] = PERSON_SPEED;

    addAction.addCombinedMoving(this.gameObject, dividedPos, speedSet);
    gameStatus.setObjMoving(MOVEMENT.Moving);
}

7、好了。分離動作的步驟應該就做完了。還有就是要設定船移動和人移動不能人機互動。

8、在上一次作業我已經在船的腳本里面設定了一個isMoving的私有變數來判斷了。但是這次還有人的移動,在船/人兩個腳本里面都設定這樣的私有變數就有點累贅了,所以直接在場景控制指令碼mainSceneController裡設定一個公用的isGameObjectMoving私有變數。同時設定修改的public方法setObjMoving()。在船移動和人移動的開始時候呼叫此方法,說明正在有gameObjet移動,而此時其他的動作在啟動前都會根據IQueryGameStatus 查詢當前是否有其他物體在運動,如有即自身動作無效。

public void setObjMoving(bool isMoving) {
    isGameObjectMoving = isMoving;
}


9、上面第3點也已經提到了,CCActionManager裡面有個回撥方法SSActionEvent,即每當有動作結束的時候會呼叫。所以只需要在這裡呼叫mainSceneController的方法,修改isGameObjectMoving的值即可。之後又可以允許動作產生了。

public void boatReachBank() {
    myGenGameObjects.boatReachBank();
    isGameObjectMoving = MOVEMENT.NotMoving;
}

public void personFinishMoving() {
    Debug.Log("person finish moving");
    isGameObjectMoving = MOVEMENT.NotMoving;
}


10、這樣就差不多了~這次作業比較簡單就不放程式碼啦害羞

相關推薦

[Unity3D課堂作業] 改進Priests and Devils 牧師惡魔

還是先po一下效果咯~~ 這次作業其實就是:將上次作業在Update()函式一幀幀改位置控制運動,改為類似cocos2d的一個Action方法控制物體自己運動,也就是所謂的面向物件的設計。但其實本

[Unity3D課堂作業] Priests and Devils 牧師惡魔

#感覺這門課作業不提前寫真搞不定啊_(:зゝ∠)_ #文末有全部程式碼以及操作方法 先把遊戲效果po一下吧(白色膠囊體代表牧師、紅色膠囊體代表魔鬼、藍色代表船、兩條白色圓柱體代表兩岸): 這次作業與TA的實現方法稍有不同,多用了兩個類:PersonStatus(動態載

unity3D-learninPriests and Devils

閱讀以下游戲指令碼Priests and DevilsPriests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within the time limit. Ther

軟導作業牧師惡魔小遊戲分析

類有以下幾種: 組別 類別 1 background 2 sprite 3 text 4 timer 5 bottom 6 audio 7 mouse

牧師惡魔小遊戲 動作分離

      上次弄了一個牧師與惡魔小遊戲的MVC基礎版(部落格),這次,在原來程式碼的基礎上進行修改,增加動作管理器。動作管理部分的類圖如下:       由於上課時間有限,老師對這個的講解並不是很多,自己一開始直到作業要求的時候,也是有點懵,搞不懂究竟要

unity3d 牧師惡魔

本次遊戲的設計採用MVC模式,遊戲中的所有GameObject就是Model,View包括toSolveClick和GuiCtrl,Controller包括FirstController以及FirstController裡的各個controller(boat

《軟件工程》課堂作業返回一個整數數組中最大字數組的和

col 連續 com main 正數 技術分享 span 課堂 組成 輸入一個整形數組,數組裏有正數也有負數。數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。 求所有子數組的和的最大值。 實驗思路: 從第一個元素開始循環,在嵌套另一個循環,從每個元素

課堂作業unitTest_hw_20181102

# -*- coding:utf-8 -*-# @Time :2018/11/5 8:55# @Author :菜鳥先生# @Email :[email protected]# @File :unitTest_hw_1102.py#包含3個列表region={"河北":["張家口","石家莊","廊

課堂作業返回一個二維整陣列中最大子陣列的和

  要求: 1.輸入一個二維整形陣列,數組裡有整數也有負數。 2.二維陣列中連續的一個子矩陣組成一個子陣列,每個子陣列都有一個和。 3.求所有子陣列的和的最大值。要求時間複雜度為O(n)。 結對程式設計要求: 1.兩人結對程式設計任務。 2.一人主要負責程式分析,程式碼程式設計。 3

JavaScript案例分析圖片庫改進(2)

1.優化      showPic函式中裡仍存在一些需要處理的假設     ①檢查title屬性是否存在,可以測試它是否為null var text=whichpic.getAttribute("title")?whichpic.get

【雲星資料---Apache Flink實戰系列(精品)】Apache Flink高階特性高階應用004-Flink的作業排程情況001

一、作業(Job)和排程(Scheduling) 1.排程(Scheduling) 1.Flink叢集一般有一個或多個TaskManager,每個TaskManager有一個或多個slot來

Tensorflow學習筆記基礎篇(7)——Mnist手寫集改進(Tensorboard視覺化)

Tensorflow學習筆記:基礎篇(7)——Mnist手寫集改進版(Tensorboard視覺化介面) 前序 — 前文中,我們在三層全連線神經網路中使用了學習率隨迭代次數增加而逐漸衰減的AdamOptimizer優化器來完成MNIST資料的分類問題,最

<每日一題>題目26選擇排序(冒泡排序改進)

range pro 排序 image inf cprofile 好的 sort 技術分享 ‘‘‘ 選擇排序:選擇最小的,以此類推 ‘‘‘ import random import cProfile def select_Sort(nums): for i

ffmpeg應用例項從拉流到推流(改進

說明: 1、使用 rtmp地址 和 rtsp地址 測試,程式可執行,生成的flv檔案可用VLC播放器播放; 2、音訊和視訊有些不同步; 3、網路推流不穩定,還有問題待解決; #include "stdafx.h" extern "C" { #include "libavc

*Android 多線程下載 仿下載助手(改進

result 代碼 android exist delete efault dsta stat sdn 首先聲明一點: 這裏的多線程下載 並非指的 多個線程下載一個 文件。而是 每一個線程 負責一個文件。真正的多線程 希望後面能給大家帶來。 -------------

我的改進2048(2)

void 必須 number 內存 font return nbsp water pan (假設有誰想要這個軟件的話,在評論中留一個郵箱吧。) 上篇解說了我的2048的基本設計過程。一開始的時候初始化,隨機填上兩個數字。每次按方向鍵。16個方格

手勢跟蹤論文學習Realtime and Robust Hand Tracking from Depth(三)Cost Function

引入 tail track col div 理想 問題 from details iker原創。轉載請標明出處:http://blog.csdn.net/ikerpeng/article/details/39050619 Realtime and Robust Hand

Google Tango Java SDK開發Configure and Connect 配置和連接

-a register htm -s contains when startup tracking button Configure and Connect 配置和連接 Note: This section assumes you are familiar with th

機房收費系統個人重構軟工文檔中那些圖

甘特圖 模塊 -s 繪圖工具 收費 -m div post 問題 【前言】 圖。提到這個字的時候腦海中就會出現許很多多的圖像,它的重要性相信大家都明確。相比於文字來說它更生動形象正好符合人類大腦的記憶規律。非常多人也知道動畫片制作原理也是用一張張圖

HDU - 1312 Red and Black

getchar() nbsp and stand oid std void tile follow There is a rectangular room, covered with square tiles. Each tile is colored either red