Unity3D案例太空射擊(Space Shooter)流程介紹與程式碼分析(上)
此時的飛機只是一個靜止的圖片,為了檢測飛機是否與子彈發生碰撞,我們需要加入一個碰撞檢測器
之後,為了模擬真實飛機情況,我們加入飛機的火焰噴射效果,將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學習筆記(31)KAZE 演算法原理與原始碼分析(五)KAZE的原始碼優化及與SIFT的比較
KAZE系列筆記: 1. OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2. OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構建 3. Op
OpenCV學習筆記(30)KAZE 演算法原理與原始碼分析(四)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.js(v5.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)只需要面