1. 程式人生 > >Unity3D案例太空射擊(Space Shooter)流程介紹與程式碼分析(上)

Unity3D案例太空射擊(Space Shooter)流程介紹與程式碼分析(上)

最近開始接觸遊戲製作,用Unity製作一些簡單的遊戲進行入門。這幾篇部落格總結了Space Shooter的製作流程,並對程式碼進行了分析。一是方便自己日後進行回顧與補充,二是為了讓讓更多的遊戲愛好者接觸遊戲開發,少走彎路。 Space Shooter是一個入門級的專案,很適合新手學習。藉由這款遊戲,我們可以瞭解Unity中的介面以及常用操作,並對整個引擎有個籠統的認知,程式碼只需要一些程式設計基礎,門檻不高(主要是C#) 說回正題,製作這款遊戲需要如下資料。 (資源包含:Unity4.6.9軟體安裝包、破解器、破解教程以及Space Shooter資源包) 以上就是準備工作,接下來就可以正式進入這個遊戲開發之中。具體操作參見視訊。
本部落格側重於步驟梳理以及程式碼分析,不足之處敬請指正,也歡迎各位留言交流問題與看法。 部落格結構分為三部分 第一部分為遊戲基本素材的新增。包括飛機、背景、燈光以及子彈的新增,涉及到一些基本的程式碼操作。 第二部分為遊戲基本功能的實現,包括隕石的產生、碰撞等操作。 第三部分為遊戲效能的完善部分,包括音效、計分,銷燬以及遊戲結束後的重新載入部分。 傳送門: 太空射擊(Space Shooter)流程介紹與程式碼分析(上) 1.新增飛機 新增飛機是完成該遊戲的第一步,首先,將素材匯入進Asset中,將飛機部件拖入編輯環境中,調整Roatation使飛機處在攝像機的視角內。
此時的飛機只是一個靜止的圖片,為了檢測飛機是否與子彈發生碰撞,我們需要加入一個碰撞檢測器
,在Inspector中的Add Component中新增一個Mesh Collider,再將下圖中檔案拖入Mesh中,完成新增,之後只要去掉Mesh Renderer,即可看到下右圖中的剛體檔案。          除此之外,我們需要加入一個rigidbody(剛體,操作類似新增Mesh Collider),將重力去除。
之後,為了模擬真實飛機情況,我們加入飛機的火焰噴射效果,將Prefabs中的engineer拖動至playerShip中,並設定位置,使噴射器與飛機結合,如下圖。 以上就完成了簡單的第一步,可以看到一架飛機正在待命!
2.新增燈光與背景 上述的操作只是添加了一個飛機,整個飛機的紋理特性不能很好地看出,因此需要加入一些燈光效果。在GameObject中新增Light——Directional Light,燈光的亮度又途中紅框部分決定,可以自定義設定。並且Intensity可以調節燈光強度。

同理,可以再新增一個燈光(Fill Light),與之前新增的燈光效果形成疊加,增強立體感。如下所示。
背景的新增通過以下步驟完成:新建一個空的GameObject,並將背景素材拖入。
3.飛機控制 在playership中新建一個new script,用以控制玩家飛機的移動。在指令碼中輸入
using UnityEngine;
using System.Collections;
public class PlayeControl : MonoBehaviour {
    public float speed = 10f;
    void fixedUpdate()
    {
        float h = Input.GetAxis("Horizontal");    //飛機的水平移動
        float v = Input.GetAxis("Vertical");    //飛機的垂直移動
        Vector3 move = new Vector3 (h, 0f, v);    //移動資料賦值給move
        rigidbody.velocity = speed * move;    
    }
}
即可,此時飛機可以實現運動功能,但是範圍卻無法限定,因此對上述程式碼進行修改,在Game模式下,獲取飛機的x,z資訊以設定PlayerShip的活動範圍
using UnityEngine;
using System.Collections;
public class PlayeControl : MonoBehaviour {
    public float speed = 10f;
    public float xMin = -10.15f;//移動範圍
    public float xMax = -1.69f;
    public float yMin = -6.66f;
    public float yMax = 10.90f;
    void FixedUpdate()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        Vector3 move = new Vector3 (h, v, 0f);
        rigidbody.velocity = speed * move;
        rigidbody.position = new Vector3
        (
            Mathf.Clamp(rigidbody.position.x,xMin,xMax),    //用Clamp函式對範圍進行限制
            Mathf.Clamp(rigidbody.position.y,yMin,yMax),
            1.3f
        );
    }
}
即可 4.建立子彈 新建一個空的object,再新建一個quad,將
為了去除子彈的背景黑框,將背景設定為additive
之後,為子彈新增一個rigidbody,參見飛機PlayerShip的設定,去除gravity,並新建一個指令碼反映子彈運動,如下
using UnityEngine;
using System.Collections;
public class BulletMovement : MonoBehaviour {
    public float speed = 10f;
    // Use this for initialization
    void Start () {
        rigidbody.velocity = transform.up* speed;    //子彈運動
    }
    
}
即可 之後就可以看見子彈沿著垂直方向往上運動並最終消失的場景,可以通過更改speed以改變運動速度。 子彈在運動中會碰到敵機或者隕石,這時候我們就要判斷子彈是否與物體發生碰撞,我們在Bullet中加入一個Capsule Collider以檢測子彈是否與物體發生碰撞,將半徑(radius)與高度(height)設定好即可。
5.發射子彈 隨著飛機的移動,子彈發射點也要隨著飛機進行移動,因此在playership中建立一個空object記錄子彈位置。(採用bulletPosition表示) 對playerControl函式中進行修改
using UnityEngine;
using System.Collections;
public class PlayeControl : MonoBehaviour {
    public float speed = 10f;
    public GameObject bullet;    //建立子彈
    public GameObject bulletPosition;    //建立子彈發射位置
    public float xMin = -10.15f;
    public float xMax = -1.69f;
    public float yMin = -6.66f;
    public float yMax = 10.90f;
    void FixedUpdate()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        Vector3 move = new Vector3 (h, v, 0f);
        rigidbody.velocity = speed * move;
        rigidbody.position = new Vector3
        (
            Mathf.Clamp(rigidbody.position.x,xMin,xMax),   
            Mathf.Clamp(rigidbody.position.y,yMin,yMax),
            1.3f
        );
    }
    void Update()
    {
        if (Input.GetButton ("Fire1"))
        {
            Instantiate    //子彈射擊函式
                (
                bullet,
                bulletPosition.transform.position,
                bulletPosition.transform.rotation
                    );
        }
    }
}
並按照下左圖操作將程式碼中建立的兩個例項填充,即可實現發射子彈功能,但此時的子彈發射過快並且會四處散開,如下右所示
只需l勾選子彈VFX中的的Is Trigger以及給子彈一個發射限制函式即可,Is Trigger屬性勾選表示物體不受作用力的影響,相當於一個虛體,但能產生碰撞事件。 程式碼中加入
    public float fireRate = 0.25f; //一秒最多發射4發
    private float nextFireTime;    
以及將Update中if函式修改為
if (Input.GetKeyDown(KeyCode.Space)&&Time.time > nextFireTime)    //按空格發射並受到發射頻率的限制
        {
            nextFireTime = Time.time + fireRate;
            Instantiate    
                (
                bullet,
                bulletPosition.transform.position,
                bulletPosition.transform.rotation
                    );
        }

即可

以上就是基本素材的新增及相應的程式碼操作,之後將會介紹核心的遊戲功能程式碼。

相關推薦

Unity3D案例太空射擊Space Shooter流程介紹程式碼分析

最近開始接觸遊戲製作,用Unity製作一些簡單的遊戲進行入門。這幾篇部落格總結了Space Shooter的製作流程,並對程式碼進行了分析。一是方便自己日後進行回顧與補充,二是為了讓讓更多的遊戲愛好者接觸遊戲開發,少走彎路。 Space Shooter是一個入門級的專案,很

Unity3D案例太空射擊Space Shooter流程介紹程式碼分析

這部分內容關注的是遊戲性的提升,包括音效、計分等功能的實現。 傳送門: 太空射擊(Space Shooter)流程介紹與程式碼分析(下) 11.新增音效 音效分配3種,爆炸音效、發射子彈音效和背景音效。其中爆炸音效將音訊檔案直接拖入爆炸素材中即可,如下所示。 對

Unity3D案例太空射擊Space Shooter流程介紹程式碼分析

(上)部分主要介紹了素材的新增以及基本的移動與涉及功能,這部分關注事件的實現(如碰撞檢測)。 傳送門: 太空射擊(Space Shooter)流程介紹與程式碼分析(中) 6.邊界的設定 在上述過程中,若一直髮射子彈,在Hierarchy中會一直出現子彈的程序,造成不

RPG遊戲《黑暗之光》流程介紹程式碼分析:角色控制系統的實現

第三章:角色控制本篇部落格主要對人物移動及其相關操作進行分析,主要包括主角以及鏡頭的移動。在遊戲介面中,我們使用Camera作為視角。為了方便之後判斷當前tag,我們新建一個Tag指令碼,存入一些tag資訊,之後呼叫就不容易出錯using UnityEngine; using

初識keepalived——keepalived介紹安裝

keepalivedkeepalived介紹keepalived作為高可用集群的一種實現方式,相對於proxy和heartbeat輕量得多,而集群根據實現的功能不同可以分為3種:1.HA(high available)集群:由一組對外提供相同服務的設備組成,組內每一臺設備故障不會影響到服務的正常提供。2.LB

十二 web服務javaweb結合3

pack ppi web工程 配置 time star con http ont 一、需求 上一章節雖然將webservice和web項目綁定在了一起,但是還是不能共同一個端口,本章講解webservice和web項目綁定且共同端口。 二、案例   2.1  創建w

數據結構-堆 接口定義實現分析詳細註釋圖解

info 獲取 init ret targe 動態 函數 target 用戶自定義函數 如果想了解堆的概念,可以點擊此處查看前面關於堆的定義的隨筆。 堆的操作接口包括初始化堆、銷毀堆、向堆中插入元素、從堆頂移除元素、堆的結點個數。 我們用heap來命名一個堆。下面是對以上接

Swift - 反射Reflection介紹使用樣例附KVC介紹

comment 人員 BE display java pri ex18 pla 是否 1,反射(Reflection) 對於C#、Java開發人員來說,肯定都對反射這個概念相當熟悉。所謂反射就是可以動態獲取類型、成員信息,同時在運行時(而非編譯時)可以動態調用任意方法、屬性

PHP單一入口概述優缺點分析

inf 記錄 很難 前臺 接收 pathinfo 效率 www. str 單一入口概述單一入口的應用程序就是說用一個文件處理所有的HTTP請求,例如不管是列表頁還是文章頁,都是從瀏覽器訪問index.php文件,這個文件就是這個應用程序的單一入口。打個比方,大家都要上WC,

算法筆記:復雜度分析

n+1 增長 角度 復雜 判斷 and 就是 ret 執行時間 (一)漸進符號(這裏暫時只考慮大O) 以輸入規模n為自變量建立的時間復雜度實際上還是較復雜的,例如an2+bn+c+1,不僅與輸入規模有關,還與系統a、b和c有關。此時對該函數進一步抽象,僅考慮運行時間的

OpenCV學習筆記31KAZE 演算法原理原始碼分析KAZE的原始碼優化及SIFT的比較

  KAZE系列筆記: 1.  OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2.  OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構建 3.  Op

OpenCV學習筆記30KAZE 演算法原理原始碼分析KAZE特徵的效能分析比較

      KAZE系列筆記: 1.  OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2.  OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構

Java常用的八種排序演算法程式碼實現:桶排序、計數排序、基數排序

三種線性排序演算法:桶排序、計數排序、基數排序 線性排序演算法(Linear Sort):這些排序演算法的時間複雜度是線性的O(n),是非比較的排序演算法 桶排序(Bucket Sort)   將要排序的資料分到幾個有序的桶裡,每個桶裡的資料再單獨進行排序,桶內排完序之後,再把桶裡的

Java常用的八種排序演算法程式碼實現:歸併排序法、快速排序法

注:這裡給出的程式碼方案都是通過遞迴完成的 --- 歸併排序(Merge Sort):   分而治之,遞迴實現   如果需要排序一個數組,我們先把陣列從中間分成前後兩部分,然後對前後兩部分進行分別排序,再將排好序的數組合並在一起,這樣整個陣列就有序了   歸併排序是穩定的排序演算法,時間

深入理解overlayfs:使用原理分析

在初步瞭解overlayfs用途之後,本文將介紹如何使用overlayfs以及理解該檔案系統所特有的一些功能特性。由於目前主線核心對overlayfs正在不斷的開發和完善中,因此不同的核心版本改動可能較大,本文儘量與最新的核心版本保持一致,但可能仍會存在細微的出入。 核心版本:Linux-4.1

基於Visual C++之Windows核心程式設計程式碼分析1實現裝置管理器列舉裝置

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Darknet 程式碼分析之一,準備工作

用yolo v3檢測圖片中的某種植物,沒找到網路定義檔案中的說明,看一下darknet的程式碼,做個筆記。 程式碼來源: Alexey AB維護的Darknet 版本: https://github.com/AlexeyAB/darknet 關於訓練自己的資料,說明見 https:/

Darknet 程式碼分析之二,parse_network_cfg_custom函式

parse_network_cfg_custom函式中,讀取配置檔案是先把各個section讀取出來,然後再解析。 yolov3.cfg裡面只有幾個不同的section,分別是[net]、[convolutional]、[shortcut]、[yolo]、[route]、[upsample]

d3.jsv5.7的node資料匹配自動匹配擴充套件函式

在d3操作時,當然少不了對已有節點繫結資料,那麼問題就來了,節點個數和資料長度不一樣的,怎麼辦。 d3在節點少於資料長度的時候,有enter().appen()方法實現node的增加; 在節點大於資料長度的時候,有exit().remove()實現對多餘節點的刪除; 但是,操作是這樣的:

django之ORM介紹基本用法

  一、ORM介紹 1.什麼是ORM ORM 全拼Object-Relation Mapping. 中文意為 物件-關係對映. 在MVC/MVT設計模式中的Model模組中都包括ORM 2.ORM優勢 (1)只需要面