1. 程式人生 > >unity3d學習(二)製作第一人稱射擊-玩家射擊和新增敵人

unity3d學習(二)製作第一人稱射擊-玩家射擊和新增敵人

玩家射擊和新增敵人

寫在前面:
- 學習課本:Unity5實戰 使用c#和unity開發多平臺遊戲-作者:Joseph Hocking
- 內容:第三章
-

讓玩家能夠射擊

第一步:通過射線發射
因為我們是第一人稱射擊,我們可以使用unity提供的ScreenPointToRay(),建立一個從攝影機開始發射的射線。一旦有了射線,它能被傳入Physics.Raycast()方法中。
向攝影機新增RayShooter指令碼
using UnityEngine;
using System.Collections;

public class RayShooter: MonoBehaviour 
{
    void
Start() { _camera = GetComponent<Camera>();//獲取相機上的Camera元件 } void Update() { if(Input.GetMouseButtonDown(0))//當點選左建執行發射射線 { Vector3 point = new Vector3(_camera.pixelWidth/2,_camera.pixelHeight/2,0);//發射位置 Ray ray = _camera.ScreenPointToRay(point);//建立射線
RayCastHit hit;//資料結構變數 if(Physics.Raycast(ray,out hit))//在此方法中尋找射線資訊,並且賦值給hit變數 { //獲取射線與射擊到物體的交叉位置,並且進行一些操作 //Debug.Log("Hit "+hit.point); StartCoroutine(SphereIndicator(hit.point));//執行此協程 } } } private
IEnumerator SphereIndicator(Vector3 pos)//執行協程來響應擊中 { GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);//建立一個球體。 sphere.transform.position = pos;//表示擊中此位置 yield return WaitForSeconds(1);//表示等待一秒再執行此函式下面的內容 Destory(sphere); } // 新增視覺化指示器 void OnGUI()//unity會自動響應OnGUI方法。每幀之後執行 { int size = 12;//這是準星影象的長度,減去它確保準星對準中心點 float posX = _camera.pixelWidth/2-size/4; float posY = _camera.pixelHeight/2-size/2; } }

製作一個敵人

第一步:製作一個長方體作為敵人(下圖左邊):
這裡寫圖片描述
併為其新增一個ReactiveTarget指令碼,程式碼如下:
using UnityEngine;
using System.Collections;

public class ReactiveTarget: MonoBehaviour {
    public void ReactToHit()//單敵人被攻擊執行的操作
    {
        StartCoroutine(Die());
    }

    private IEnumerator Die()
    {
        this.transform.Rotate(-78,0,0);//做一些死亡的動作

        yield return WaitForSeconds(1.5f);//等待幾秒再執行消失

        Destory(this.gameObject);
    }
}
第二步:修改上面RayShooter指令碼的部分程式碼
RayShooter指令碼現在擊中目標後,我們只是讓它產生了一個球體,如果我們擊中敵人,我們需要敵人死亡。程式碼修改如下
...
         if(Physics.Raycast(ray,out hit))//在此方法中尋找射線資訊,並且賦值給hit變數
            {
                GameObject hitObject = hit.transform.gameObject;//獲取射線交叉的物件
                //獲取射線與射擊到物體的交叉位置,並且進行一些操作
                ReactiveTarget target = hitObject.GetComponent<ReactiveTarget>();//試著獲取此物件ReactiveTarget指令碼元件
                if(target!=null)//如果有此元件的,說明是敵人。
                {
                    target.ReactToHit();
                }
                else
                {
                    StartCoroutine(SphereIndicator(hit.point));//執行此協程
                }
            }
...

總結

  • 1、Camera.pixelWidth、Camera.pixelWidth.pixelHeight、Camera.ScreenPointToRay()。分別是攝影機的寬和高。最後一個是從攝影機發射射線
  • 2、Physics.Raycast():記錄所有射線的資訊,並可以把射線資訊給一個RaycastHit結構的變數
  • 3、StartCoroutine():啟動一個協程。它保持執行直到函式結束,可以在執行中暫停。引數是一個函式。
  • 4、yield關鍵字:這個關鍵字導致協程臨時暫停,在下一幀繼續執行。
  • 5、IEnumerator型別:StartCoroutine需使用。
  • 6、OnGUI():和Start(),Update()類似。MonoBehaviour自動響應OnGUI方法。並且繪製的東西出現在3D場景最上層。

注意:很多類和方法不清楚請檢視官方文件

相關推薦

unity3d學習製作第一人稱射擊-玩家射擊新增敵人

玩家射擊和新增敵人 寫在前面: - 學習課本:Unity5實戰 使用c#和unity開發多平臺遊戲-作者:Joseph Hocking - 內容:第三章 - 讓玩家能夠射擊 第一步:通

Unity3D學習:使用JSON進行對象數據的存儲讀取

進行 存儲路徑 新的 del jpg cati spa 全局變量 .net 前言 前段時間完成了自己的小遊戲Konster的制作,今天重新又看了下代碼。原先對關卡解鎖數據的存儲時用了Unity自帶的PlayerPref(字典式存儲數據)。 讀取關卡數據的代碼: voi

Java學習第一章 計算機、程式Java概述

第一章 計算機、程式和Java概述   (1)匯流排--》    儲存裝置、記憶體、CPU、通訊裝置、輸入裝置、輸出裝置; (2)語言: 機器語言: 二進位制形式

深度學習——從零自己製作資料集到利用deepNN實現誇張人臉表情的實時監測tensorflow實現

一、背景介紹 這篇文章主要參考我的上一篇文章:深度學習(一)——deepNN模型實現攝像頭實時識別人臉表情(C++和python3.6混合程式設計)。由於上一篇文章的模型所採用的資料集為fer2013,前面也介紹過這個基於這個資料集的模型識別人臉表情的準確率大概在70%左右

lfs學習筆記構建第一遍工具鏈

lfs學習筆記(一)的地址:https://www.cnblogs.com/renren-study-notes/p/10199344.html   一名linux愛好者,記錄構建Linux From Scratch的過程 經部落格園-駿馬金龍前輩介紹,開始接觸學習lfs,用部落格記錄學習筆記

區塊鏈開發學習--使用solidity編寫第一個智慧合約

上一篇講到如何安裝以太坊客戶端Geth,安裝好後很好奇如何往節點上部署一個合約,本文一起走一下流程; (1)登陸http://remix.ethereum.org/                remix 是

Unity學習過程——建立第一個工程

1.首先開啟unity,我這裡的是unity5.2.3f1版本。不過基本功能介面,unity5都是一樣的~ 2.然後在開啟的的unity程式中選擇new,這裡面有供3D與2D開發的選擇~還可以匯入標準包下的資源。預設unity5的標準包不在安裝包裡(換句話說就是unity5

Cocos2d-x學習 在Cocos2d-x2.2.6搭建你第一個專案

標題有些長,沒有辦法,這裡是為了突出版本Cocos2d-x2.2.6的特性,如果按照我前一篇博文Cocos2d-x學習(一) Cocos2d-x2.2.6安裝前準備,前面的基本工作已經做完了。 一.檢

javascript學習——第一部分 JavaScript語言核心

第四章 表示式和運算子 4.1原始表示式         常量、直接量、關鍵字(this返回當前物件)和變數 4.2物件和陣列的初始化表示式           物件和陣列初始化表示式實際上是一個新建立的物件和陣列。這些初始化表示式優勢稱作“物件直接量”和“陣列直接量”,但

第一行程式碼第二版學習

Button 6.0以上 呼叫android:textAllCaps=“false”來禁用這一預設特性 XML屬性中可以同時指定多個值(通過”|“符號分隔開) 例:android:gra

爬蟲庫之BeautifulSoup學習

不必要 baidu html left 官方 blank 正則 文本處理 比較 BeautifulSoup官方介紹文檔:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html 四大對象種

數據結構學習筆記 線性表的順序存儲鏈式存儲

出錯 初始化 node != test span 輸入 des val 線性表:由同類型數據元素構成有序序列的線性結構  --》表中元素的個數稱為線性表的長度  --》沒有元素時,成為空表  --》表起始位置稱表頭,表結束位置稱表尾 順序存儲:    1 package

cocos2dx 3.1從零學習——菜單、場景切換、場景傳值

天空 ptr select 特效 new 要點 綁定 使用 water 回想一下上一篇的內容,我們已經學會了創建一個新的場景scene,加入sprite和label到層中。掌握了定時事件schedule。我們能夠順利的寫出打飛機的主場景框架。 上一篇的內容我練習了七個新

redis學習——String數據類型

字符串類型 創建 復雜度 back nbsp 命令 時間復雜度 value con 一、概述 字符串類型是Redis中最為基礎的數據存儲類型,它在Redis中是二進制安全的,這便意味著該類型可以接受任何格式的數據,如JPEG圖像數據或Json對象描述信息等。在R

Linux 網卡驅動學習網絡驅動接口小結

-a key 頻率 網絡 上網 ren 網絡設備 ews 入口 【摘要】前文我們分析了一個虛擬硬件的網絡驅動樣例。從中我們看到了網絡設備的一些接口。事實上網絡設備驅動和塊設備驅動的功能比較相似,都是發送和接收數據包(數據請求)。當然它們實際是有非常多不同

ArcGIS API for JavaScript學習1第一個地圖

樣式表 參數 資源 charset 底層 arcgis 順序 api navi 1.簡介 ArcGIS API for JavaScript跟隨ArcGIS 9.3同時發布,是ESRI根據JavaScript技術實現的調用ArcGIS Server REST API接口的一

ext2文件系統學習—— 目錄磁盤結構

echo free 文件格式 htm file 目錄結構 bitmap 點號 name 創建鏡像、mount等操作和上一篇一樣,測試目錄結構如下: 一些文件系統信息如下: Block size: 1024 Inodes per group: 1

RabbitMQ學習工作隊列

lose borde 阻塞 lpad mes getc actor 使用 處理 1.工作隊列(Work Queue)又叫任務隊列(Task Queue)指將任務分發個多個消費者。 2.實際操作: 這裏使用一個生產者產生多條數據提供給3個消費者

JAVA學習 String使用equals方法==分別比較的是什麽?

找到 基礎上 stirng print 大小 obj lis 分配 ret String使用的equals方法和==的區別 equals方法和==的區別 首先大家知道,String既可以作為一個對象來使用,又可以作為一個基本類型來使用。這裏指的作為一個基本類型來使用只是

CSS學習

種類 round align 圖片 單獨 tom -s 中控 vertical 列表 在HTML中,有兩種類型的列表: 無序列表 - 列表項標記用特殊圖形(如小黑點、小方框等) 有序列表 - 列表項的標記有數字或字母 使用CSS,可以列出進一步的樣式,