《Unity3D脚本编程与游戏开发》学习Day one
Unity學(xué)習(xí)第一日
- 前言
- Unity介紹
- 游戲開(kāi)發(fā)技術(shù)
- 技術(shù)實(shí)現(xiàn)與游戲設(shè)計(jì)
- 第一章 Unity腳本概覽
- 1.1 控制物體的移動(dòng)
- 1.1.1 新建腳本并掛載
- 1.1.2 Start 和 Updata 事件
- 1.1.3 修改物體位置
- 1.1.4 讀取和處理輸入
- 1.1.5 實(shí)例:實(shí)現(xiàn)一個(gè)移動(dòng)的小球
- 1.2 觸發(fā)器事件
- 1.2.1 創(chuàng)建觸發(fā)器
- 1.2.2 觸發(fā)器事件函數(shù)
- 1.2.2 實(shí)例:吃金幣
前言
?Unity 是實(shí)時(shí)3D互動(dòng)內(nèi)容創(chuàng)作和運(yùn)營(yíng)平臺(tái)。
?使用Unity前我們需要先了解這個(gè)游戲引擎。
?Unity官網(wǎng)
Unity介紹
-
使用Unity開(kāi)發(fā)的軟件:
原神
王者榮耀
明日方舟
使命召喚手游
爐石傳說(shuō) -
百度百科
-
Unity 用戶手冊(cè)
游戲開(kāi)發(fā)技術(shù)
- 游戲設(shè)計(jì) (游戲的靈魂)
- 美術(shù)制作 (游戲的外表)
- 技術(shù)實(shí)現(xiàn) (游戲的骨骼和血肉)
技術(shù)實(shí)現(xiàn)與游戲設(shè)計(jì)
? 游戲技術(shù)與游戲設(shè)計(jì)互相促進(jìn):技術(shù)為設(shè)計(jì)帶來(lái)可能性的空間,設(shè)計(jì)指導(dǎo)者技術(shù)的發(fā)展方向。
第一章 Unity腳本概覽
?本章主在讓讀者體會(huì)腳本編程的思路和整體方法。
1.1 控制物體的移動(dòng)
?本節(jié)將詳細(xì)講解創(chuàng)建腳本、改變物體位置、處理用戶輸入等基本操作。
1.1.1 新建腳本并掛載
- 腳本的創(chuàng)建
- 方法一:
在Project(工程)窗口某個(gè)文件夾中,單機(jī)鼠標(biāo)右鍵選擇:Create->C# Script選項(xiàng)。 - 方法二:
先新建一個(gè)球體,即在Hierarchy窗口,單機(jī)鼠標(biāo)右鍵選擇:3D object->Sphere選項(xiàng)。
然后選中球體,在Insperctor(檢視)窗口單擊:Add Component(添加組件)按鈕,在菜單中選擇:New script (新建腳本)選項(xiàng),輸入腳本文件名單擊:Create and Add(創(chuàng)建并添加)。
- 方法一:
- 腳本的掛載
- 方法一:
拖拽腳本到場(chǎng)景中的球體上。 - 方法二:
拖拽腳本到Inspector窗口中項(xiàng)目的最后面。(推薦使用)
- 方法一:
- 腳本組件的刪除
?在組件名稱上單擊鼠標(biāo)右鍵,選擇:Remove Component(刪除組件)。 - 注意事項(xiàng)
?Unity 規(guī)定:能夠掛載到物體上的腳本文件必須是“腳本組件”,腳本組件要繼承自MonoBehaviour,且腳本代碼中的class名稱必須與文件名一致。(因此在修改腳本文件名時(shí),必須同時(shí)修改class名稱)。
?Unity 支持一個(gè)物體掛載多個(gè)同樣的腳本組件。
1.1.2 Start 和 Updata 事件
- 雙擊腳本文件打開(kāi)腳本,目前腳本中的內(nèi)容是自動(dòng)生成的,包括:
using UnityEngine(使用UnityEngine這個(gè)命名空間)
Start(函數(shù))
Update(函數(shù)) - Start和Update函數(shù)
Start函數(shù)在游戲開(kāi)始運(yùn)行依次,適合進(jìn)行組件初始化。
Update函數(shù)每幀都會(huì)執(zhí)行,根據(jù)系統(tǒng)資源情況,幀率可能實(shí)時(shí)變化,因此Update的執(zhí)行頻率(每秒執(zhí)行次數(shù))是變化的。
Start和Update又被稱為“事件”,因?yàn)樗鼈兎謩e是在“組件開(kāi)始運(yùn)行”和“更新該組件”這兩個(gè)事件發(fā)生時(shí)被調(diào)用的。 - Debug.Log函數(shù)
作用:向Console(控制臺(tái))窗口輸出一串信息。
用處:寫(xiě)代碼、調(diào)試代碼,是最簡(jiǎn)單、最可靠的一種調(diào)試手段。 - Time類
Time.time:顯示游戲運(yùn)行時(shí)間。
Time.deltaTime:表示從上一幀到當(dāng)前幀時(shí)間,時(shí)間增量。
Time.timeScale函數(shù)(時(shí)間縮放:默認(rèn)值為1,游戲的暫停為0,游戲的快進(jìn)可為2)。
Time類詳解
1.1.3 修改物體位置
- 在Unity 中,修改物體位置實(shí)際上就是修改Transform(變換)組件的數(shù)據(jù)。
- Inspector窗口展示了組件的位置(Position)、旋轉(zhuǎn)(Rotation)、縮放(Scale)參數(shù)。
- 在界面上可以修改的內(nèi)容一定可以在腳本中修改,但在腳本中修改的內(nèi)容不一定能在節(jié)目中修改,因?yàn)?strong>腳本的功能比界面展示的功能要多得多。
- 修改Transform組件中的Position的兩種常用方法:
- 使用Translate()函數(shù)。
即:tansform.Translate(x,y,z)。其中x、y、z為float類型量,若為常量要加上后綴f表示float類型,否則C# 認(rèn)為其為double類型。如 3.12為double類型,3.12f為float類型。 (代碼寫(xiě)于腳本函數(shù)中) - 直接指定新的位置
即:tansform.position = new Vector3(x,y,z)。 - 上述兩種方法的區(qū)別:Translate函數(shù)默認(rèn)為局部坐標(biāo)系,而修改position的方法是世界坐標(biāo)系。
- 使用Translate()函數(shù)。
- 類型轉(zhuǎn)換
int可以隱式轉(zhuǎn)換為float,所以x、y、z如果沒(méi)有小數(shù)位可以不加f后綴,但int轉(zhuǎn)float精度會(huì)降低(題外話)。
類型轉(zhuǎn)換 - 位置移動(dòng)代碼void Update(){tansform.Translate(0,0,0.1f);tansform.position += new Vector3(0,0,0.1f); }
- 游戲設(shè)計(jì)注意事項(xiàng)
?由于系統(tǒng)繁忙時(shí)無(wú)法保證穩(wěn)定的幀率,因此對(duì)于上述代碼,會(huì)導(dǎo)致小球的移動(dòng)速度和幀率成正比。
是“每幀移動(dòng)距離相同”還是“每秒移動(dòng)距離相同”呢?這需要根據(jù)游戲設(shè)計(jì)來(lái)確定,大多情況下是”每秒移動(dòng)距離相同“,因此移動(dòng)的距離應(yīng)該針對(duì)幀率去確定,”每秒移動(dòng)距離相同“的代碼如下。void Update(){tansform.Translate(0,0,5*Time.deltaTime);tansform.position += new Vector3(0,0,5*Time.deltaTime); } ?代碼中5表示速度,上述代碼的改進(jìn)原理基于:距離 = 速度 ? 時(shí)間 。兩幀畫(huà)面之間的變化基于兩幀之間間隔的時(shí)間Time.deltaTime。要記住Updata函數(shù)是每幀執(zhí)行。
1.1.4 讀取和處理輸入
- Unity 支持的輸入設(shè)備
如:鍵盤(pán)?、鼠標(biāo)🖱、手柄🎮等。
Unity 支持的多種輸入設(shè)備 - Input.GetAxis函數(shù)
示例代碼如下 void Update(){float v = Input.GetAxis("Vertical");float h = Input.GetAxis("Horizontal");Debug.Log("當(dāng)前輸入 縱向:" + v + "橫向:" + h);transform.position += new Vector3( h*speed, v * speed, 0);} Input.GetAxis返回取值范圍為[-1,1]的float類型值。若傳入?yún)?shù)"Vertical"表示返回沿縱軸的輸入,傳入?yún)?shù)"Horizontal"表示返回沿縱軸的輸入。上述代碼可能存在問(wèn)題,那就是針對(duì)幀率不同按鍵后小球速度不一致,所以應(yīng)再乘以Time.deltaTime。 - 字符串拼接
1.1.5 實(shí)例:實(shí)現(xiàn)一個(gè)移動(dòng)的小球
- 代碼如下:
- 使用上述代碼拖動(dòng)到小球上,調(diào)整攝像機(jī)的Rotation朝向?yàn)?0,0,0),運(yùn)行即可移動(dòng)小球。
- 代碼解讀
public float speed = 10;(設(shè)置速度)
gameObject.GetComponent().material.color = Color.red;(設(shè)置小球顏色) - 注意事項(xiàng)
- 腳本中的public類型變量可以在Inspector窗口看到和修改。若將public改為private,則變量在窗口中不可見(jiàn)、不可改。
- 在不同條件下修改腳本中的變量值有不同的作用時(shí)間(如下表所示)
| 作用時(shí)間 | 腳本創(chuàng)建后 | 永久 | 運(yùn)行中 |
?創(chuàng)建腳本時(shí)設(shè)置了公開(kāi)(public)變量,則其代碼中的初始值會(huì)生效。
?當(dāng)運(yùn)行時(shí),在Inspector窗口對(duì)腳本中的public變量進(jìn)行修改,會(huì)在當(dāng)次運(yùn)行的以后時(shí)間里生效。
?當(dāng)未運(yùn)行時(shí),在Inspector窗口對(duì)腳本中的public變量進(jìn)行修改,會(huì)在當(dāng)前Unity 項(xiàng)目窗口中生效。退出項(xiàng)目窗口時(shí)若選擇Save保存,則其值會(huì)在項(xiàng)目中生效。
?以上內(nèi)容意味著:
??當(dāng)創(chuàng)建完腳本后,每一次修改腳本中的值,但在Unity 項(xiàng)目中不會(huì)生效。
??當(dāng)游戲運(yùn)行中,修改變量,游戲結(jié)束后修改的值不會(huì)保存。(若在游戲中時(shí)事調(diào)整參數(shù),對(duì)需要保存的數(shù)據(jù)應(yīng)以記錄)
??當(dāng)游戲未運(yùn)行時(shí),修改變量,以后每一次運(yùn)行值都會(huì)生效。如果退出項(xiàng)目窗口時(shí)保存,則下一次打開(kāi)項(xiàng)目窗口也會(huì)生效。
1.2 觸發(fā)器事件
?觸發(fā)器是一個(gè)組件,它定義了一個(gè)范圍。當(dāng)其他帶有碰撞體組件的物體進(jìn)入了這個(gè)范圍時(shí),就會(huì)產(chǎn)生一個(gè)觸發(fā)事件。腳本捕捉到這個(gè)事件的時(shí)候,就可以做出相應(yīng)的處理。
1.2.1 創(chuàng)建觸發(fā)器
?Unity 中,觸發(fā)器和碰撞體共用了同一組件:Collider,實(shí)際上兩者是不同的概念。創(chuàng)建一個(gè)Cube,它自帶一個(gè)碰撞器,在Inspector窗口勾選Box Collider面板中的 Is Trigger 選項(xiàng),碰撞體就變成了同樣外形的觸發(fā)器。對(duì)小球和Cube都添加一個(gè)Rigibody(剛體)組件,勾選組件中的 Is Kinematic(動(dòng)力學(xué))選項(xiàng),若不勾選物體會(huì)一直下落。
1.2.2 觸發(fā)器事件函數(shù)
?碰撞和觸發(fā)總是發(fā)射在兩個(gè)物體之間,所以根據(jù)不同情況,可以選擇其中一個(gè)物體進(jìn)行碰撞或者觸發(fā)的處理。給Cube添加一個(gè)腳本,并且腳本內(nèi)容如下。
using System.Collections;using System.Collections.Generic;using UnityEngine;public class Coin : MonoBehaviour{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){}private void OnTriggerEnter(Collider other){Debug.Log(other.name + "碰到了我");}}?運(yùn)行游戲,在場(chǎng)景中拖拽球體,讓它和立方體接觸,就可以看到碰撞出發(fā)信息了。
- 注意事項(xiàng)
在游戲中進(jìn)行的修改游戲結(jié)束后會(huì)還原,即使是在游戲中對(duì)物體添加了組件,游戲結(jié)束后也會(huì)還原運(yùn)行前狀態(tài)。
如若球體沒(méi)有Rigidbody組件,則不會(huì)出發(fā)碰撞消息。
1.2.2 實(shí)例:吃金幣
文中內(nèi)容引用或參考《Unity3D腳本編程與游戲開(kāi)發(fā)》馬瑤-沈琰
總結(jié)
以上是生活随笔為你收集整理的《Unity3D脚本编程与游戏开发》学习Day one的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前端学习(1555):ng-app指令
- 下一篇: 泛微oa服务器文件,泛微OA根据文档的d