unity3D-牧師與魔鬼 動作分離版

1、基本操作演練

下載 Fantasy Skybox FREE, 構建自己的遊戲場景
寫一個簡單的總結,總結遊戲對象的使用

天空盒子(skybox)

在場景中,天空盒子(skybox)是代表天空或是遠景的全景紋理圖片。在實時渲染中,如果要繪製非常遠的物體,例如遠處的山、天空等,隨着觀察者的距離的移動,這個物體的大小是幾乎沒有什麼變化的,想象一下遠處有一座山,即使人走進十米、百米、甚至千米,這座山的大小也是幾乎不怎麼改變的,這個時候可以考慮採用天空盒技術。

理解天空盒子(Understanding skybox)

天空盒是一個全景視圖,分爲六個紋理,表示沿主軸(上,下,左,右,前,後)可見的六個方向的視圖。如果天空盒被正確的生成,紋理圖像會在邊緣無縫地拼接在一起,可以在內部的任何方向看到周圍連續的圖像。全景圖片會被渲染在場景中的所有其他物體後面,並旋轉以匹配相機的當前方向(它不會隨着相機的位置而變化,而照相機的位置總是位於全景圖的中心)。因此,天空盒子是在圖形硬件上以最小負載向場景添加現實性的簡單方式。
在這裏插入圖片描述

使用天空盒子(Using a skybox in Unity)

在標準資產包(Standard Assets package)(Assets > Import Package > Skyboxes)中附帶了一些高品質的天空盒子。但是也可以從互聯網來源獲取更合適的全景圖像,或使用3D建模軟件生成自己的全景圖像。

添加天空盒 有兩種方式

1 : 在當前相機上添加skybox
2 : 在當前場景上添加skybox

上面的兩種方式的結果是一樣的 ,第一種方式的優勢在於如果 世界中有多個攝像機的話,切換攝像機需要看不同的天空就可以使用這種方式實現

這裏我使用的是unity 給我們的提供的天空盒

導入方式 :
assets -> import package ->skyboxes

我們先來使用第一種方式 給攝像機添加天空盒

首先選擇hierarchy 下面的 main camera 主攝像機

然後 點擊 component->Rendering->skybox 給主攝像機添加一個 天空盒 這是我們就可以再 攝像機的 屬性欄看到 skybox 屬性
在這裏插入圖片描述

效果展示
在這裏插入圖片描述

關於Terrain的使用(地形繪製):

https://blog.csdn.net/nicolelili1/article/details/72843163
在這裏插入圖片描述

寫一個簡單的總結,總結遊戲對象的使用

常見遊戲對象有空對象,攝像機,光線,天空盒,地形,3D對象,聲音,UI系統和粒子系統以及特效。均具有Active,Name,Tag,Layer屬性.

根據Unity3D對GameObject的定義,遊戲對象是遊戲中人物、道具、場景等對象總稱。它只包含一些基礎的屬性沒有具體的功能,它們只是組件的容器,而組件實現了具體的遊戲功能。在編程過程中我們可以給一個遊戲對象添加C#代碼腳本,掛載了腳本的遊戲對象就有了具體的功能。代碼中還可以對遊戲對象的外觀、位置等屬性進行設置,遊戲對象在遊戲中的動作全部由腳本控制。所以,遊戲對象的使用可以手動添加,但其功能基本由其組件決定。

2、編程實踐

牧師與魔鬼 動作分離版
【2019新要求】:設計一個裁判類,當遊戲達到結束條件時,通知場景控制器遊戲結束

場記(控制器)管的事太多,不僅要處理用戶交互事件,還要遊戲對象加載、遊戲規則實現、運動實現等等,而顯得非常臃腫。一個最直觀的想法就是讓更多的人(角色)來管理不同方面的工作。顯然,這就是面向對象基於職責的思考,例如:用專用的對象來管理運動,專用的對象管理播放視頻,專用的對象管理規則。就和踢足球一樣,自己踢5人場,一個裁判就夠了,如果是國際比賽,就需要主裁判、邊裁判、電子裁判等角色通過消息協同來完成更爲複雜的工作。

該版本改進的目的

  • 把每個需要移動的遊戲對象的移動方法提取出來,建立一個動作管理器來管理不同的移動方法。
  • 對於上一個版本,每一個可移動的遊戲對象的組件都有一個Move腳本,當遊戲對象需要移動時候,遊戲對象自己調用Move腳本中的方法讓自己移動。而動作分離版,則剝奪了遊戲對象自己調用動作的能力,建立一個動作管理器,通過場景控制器(在我的遊戲中是Controllor)把需要移動的遊戲對象傳遞給動作管理器,讓動作管理器去移動遊戲對象。
  • 當動作很多或是需要做同樣動作的遊戲對象很多的時候,使用動作管理器可以讓動作很容易管理,也提高了代碼複用性。

Judge類

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

public class Judge : MonoBehaviour
{

public CoastController fromCoast;
public CoastController toCoast;
public BoatController boat;

//實例化的同時同步對象
public Judge(CoastController fromC, CoastController toC, BoatController b)
{
    fromCoast = fromC;
    toCoast = toC;
    boat = b;
}


public int check_game_over()
{   // 0->not finish, 1->lose, 2->win
    int from_priest = 0;
    int from_devil = 0;
    int to_priest = 0;
    int to_devil = 0;

    int[] fromCount = fromCoast.getCharacterNum();
    from_priest += fromCount[0];
    from_devil += fromCount[1];

    int[] toCount = toCoast.getCharacterNum();
    to_priest += toCount[0];
    to_devil += toCount[1];

    if (to_priest + to_devil == 6)      // win
        return 2;

    int[] boatCount = boat.getCharacterNum();
    if (boat.get_to_or_from() == -1)
    {   // boat at toCoast
        to_priest += boatCount[0];
        to_devil += boatCount[1];
    }
    else
    {   // boat at fromCoast
        from_priest += boatCount[0];
        from_devil += boatCount[1];
    }
    if (from_priest < from_devil && from_priest > 0)
    {       // lose
        return 1;
    }
    if (to_priest < to_devil && to_priest > 0)
    {
        return 1;
    }
    return 0;           // not finish
}

}

在FirstController中的使用

int check_game_over() {	// 0->not finish, 1->lose, 2->win
  
    return (new Judge(fromCoast, toCoast, boat)).check_game_over();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章