最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Unity基礎(chǔ)學(xué)習(xí)筆記01界面與動(dòng)畫(huà)系統(tǒng)

2021-11-29 20:35 作者:挽秋_z  | 我要投稿

界面布局

密碼:WOde3653

Project(工程)模塊:包含了游戲開(kāi)發(fā)過(guò)程中所有的可能用到的資源

Hierarchy(層級(jí)窗口):當(dāng)前編輯的關(guān)卡中所包含的游戲物體

Inspector(屬性窗口):對(duì)選中的物體的屬性進(jìn)行編輯

Scene(場(chǎng)景視圖):對(duì)游戲物體進(jìn)行可視化的編輯,所見(jiàn)即所得,類(lèi)似于第一人稱(chēng)視角,可以進(jìn)行控制(按住鼠標(biāo)右鍵后才可以)

Game(游戲視圖):預(yù)覽視圖,游戲在實(shí)際進(jìn)行游戲時(shí)的效果,即玩家看到的界面(即攝像機(jī)看到的畫(huà)面)

地形

導(dǎo)入高程圖

如果直接導(dǎo)入高程圖來(lái)構(gòu)建地形,高程圖的高度和寬度都需要是2的整數(shù)次冪,并且是RAW格式才可以。調(diào)整好高程圖之后,在Unity中新建一個(gè)地形,之后在屬性窗口中載入高程圖(在第五個(gè)小標(biāo)志設(shè)置中的Texture Resolutions中),然后調(diào)整高程圖的參數(shù)。

新建一個(gè)地形:GameObject-->3DObject-->Terrain(是一個(gè)很大的平面)

Terrain->Paint Terrain

1.Raise or Lower Terrain 升高或降低地形。按住shift,再用鼠標(biāo)左鍵可以將地形抹平(這個(gè)操作要在Raise or Lower Terrain下進(jìn)行)

2.Set Height可以設(shè)置一個(gè)高度上限。按住shift + 鼠標(biāo)左鍵:在當(dāng)前鼠標(biāo)點(diǎn)采集地形的高度信息,之后的高度上限就是這個(gè)采集的高度信息(這個(gè)操作要在Set Height下進(jìn)行)

3.Flatten All 將當(dāng)前的地形整個(gè)的設(shè)置為Height的高度。

4.Smooth Height 平滑工具,可以平滑一些臺(tái)階的邊緣。

5.Stamp Terrain 印章工具,如同在郵票上蓋戳。

6.Paint Texture 繪制紋理:Edit Terrain Layers..->Create Layers(第一個(gè)圖層作為基礎(chǔ)圖層平鋪到地形上,之后選擇的圖層可以進(jìn)行繪制),在添加了基礎(chǔ)紋理之后,還可以對(duì)圖層添加不同的紋理(在New Layer處,例如選擇了泥地基礎(chǔ)紋理之后,還可以對(duì)泥地添加泥地法線(xiàn)貼圖紋理)主要作用是使泥地展現(xiàn)出不同的效果。

Terrain->Paint Trees

為場(chǎng)景添加樹(shù)木

Terrain->Paint Details

為場(chǎng)景添加細(xì)節(jié)(或者說(shuō)一些裝飾物)

Edit Details...在此處進(jìn)行添加,例如為場(chǎng)景添加草叢,選擇草叢圖層,實(shí)際上是將圖片豎著插入來(lái)構(gòu)建出草叢的效果。(草叢的疏密程度可以進(jìn)行調(diào)整,以此來(lái)構(gòu)建富有表現(xiàn)力的地形效果)

構(gòu)建湖泊效果

首先需要構(gòu)建一個(gè)湖的地形效果,使用Set Height 將地形整個(gè)抬高以后,再在Raise or Lower Terrain下使用shift+鼠標(biāo)左鍵將地形磨平一部分來(lái)構(gòu)建湖泊的地形,之后在Project中找到Water的效果加入湖泊中即可。

游戲?qū)ο?/h1>

游戲?qū)ο螅℅ame Object)可以是一個(gè)角色,可以是一顆樹(shù)木,一盞燈來(lái)照亮周?chē)沫h(huán)境,或者是一個(gè)聲音源等等。

組件

組件(Component):實(shí)現(xiàn)游戲?qū)ο缶唧w功能的單元。

對(duì)于每一個(gè)物體來(lái)說(shuō),都至少有一個(gè)Transform組件,用來(lái)控制物體的位置變換,大小縮放,旋轉(zhuǎn)等操作。

組件Mesh Filter : 用來(lái)控制物體的外觀

組件Rigidbody:剛體物理組件,如果給盒子添加該組件,當(dāng)運(yùn)行游戲時(shí),盒子會(huì)做自由落體運(yùn)動(dòng)。

組件Constant Force ?:對(duì)物體添加一個(gè)向上的恒力(力的大小可以調(diào)整), 當(dāng)運(yùn)行游戲時(shí),物體會(huì)向上運(yùn)動(dòng)。

游戲?qū)ο笈c組件的關(guān)系

1.游戲?qū)ο箢?lèi)似于容器,不具任何功能。

2.通過(guò)添加各種組件從而組成特定的游戲物體。

簡(jiǎn)單腳本

編寫(xiě)好的腳本會(huì)作為組件出現(xiàn)在屬性窗口中,并且在腳本中的變量可以暴露在屬性窗口中(定義變量時(shí)將其定義為public類(lèi)型),(方便在Unity界面中進(jìn)行調(diào)整)

創(chuàng)建一個(gè)新腳本(Unity中支持C#):在Project窗口中右鍵-> Create -> C# Script,創(chuàng)建后雙擊打開(kāi)。

*在Unity里可以更改默認(rèn)的編譯器,當(dāng)自己的電腦里有多個(gè)VS編譯器或者需要使用Mono來(lái)編譯時(shí),可以從

Edit->Preferences->External Tools->External Script Editor 里來(lái)選擇默認(rèn)使用的編譯器。

動(dòng)畫(huà)系統(tǒng)

場(chǎng)景動(dòng)畫(huà)

分為場(chǎng)景動(dòng)畫(huà),角色動(dòng)畫(huà)等, 動(dòng)畫(huà)主要由關(guān)鍵幀組成(類(lèi)似于多張圖片連續(xù)播放,修改關(guān)鍵幀參數(shù),中間的數(shù)值由計(jì)算機(jī)自動(dòng)生成)。動(dòng)畫(huà)文件保存的是每一幀的網(wǎng)格信息。

選擇物體,創(chuàng)建動(dòng)畫(huà) Windows ->Animation->Animation->crate...(默認(rèn)會(huì)生成兩個(gè)關(guān)鍵幀,即關(guān)鍵幀動(dòng)畫(huà))

在Project窗口中,Animator Controller (動(dòng)畫(huà)狀態(tài)機(jī)) 可以對(duì)多個(gè)動(dòng)畫(huà)進(jìn)行控制,如順序等。右鍵某個(gè)動(dòng)畫(huà)塊 ->Make Transition 控制指向的箭頭。

動(dòng)畫(huà)的屬性窗口中 Loop Time 用來(lái)控制動(dòng)畫(huà)是否循環(huán)播放

骨骼動(dòng)畫(huà)

三維的網(wǎng)格動(dòng)畫(huà)不便于使用,插入骨骼,使三維網(wǎng)格(皮膚)被動(dòng)的運(yùn)動(dòng),便于與場(chǎng)景物體的交互。動(dòng)畫(huà)文件保存的是每一幀的骨骼姿態(tài)信息。骨架模型

在場(chǎng)景中放入模型后,在Project窗口中新建一個(gè)Animator Controller并命名,將其拖拽到選中的模型的Inspector的Animator--Controller中。

在Animator下的Parameters中點(diǎn)擊小加號(hào)選擇trigger(觸發(fā)器類(lèi)型),動(dòng)畫(huà)狀態(tài)機(jī)中連接兩個(gè)動(dòng)畫(huà)的線(xiàn)可以點(diǎn)擊,為(在Conditions中)兩個(gè)動(dòng)畫(huà)之間的轉(zhuǎn)換添加觸發(fā)條件。動(dòng)畫(huà)狀態(tài)的轉(zhuǎn)換一般要在前一個(gè)動(dòng)畫(huà)播放完成之后才會(huì)發(fā)生,如果希望交互立即發(fā)生,在連接線(xiàn)的屬性中將Has Exit Time 勾掉即可。

在Animator Controller中,當(dāng)動(dòng)畫(huà)進(jìn)行到某一幀的時(shí)候,可以添加一些觸發(fā)事件。先選中動(dòng)畫(huà)文件,在屬性窗口中的Event中進(jìn)行添加,Event的意思是當(dāng)動(dòng)畫(huà)進(jìn)行到某一幀的時(shí)候,為其添加一個(gè)響應(yīng)事件,而響應(yīng)事件對(duì)應(yīng)著腳本里面的某一個(gè)函數(shù)。調(diào)到某一幀后,在Function中添加命名(命名為腳本中的函數(shù)名)。

重定向:即可以將其他動(dòng)畫(huà)的骨骼運(yùn)動(dòng)運(yùn)用到其他的模型中,還可以實(shí)現(xiàn)動(dòng)畫(huà)狀態(tài)之間的自然融化。

Standard assets 中的ThirdPersonUserControl是一個(gè)簡(jiǎn)單的控制角色的腳本(如WASD移動(dòng),空格跳躍等)。

動(dòng)畫(huà)曲線(xiàn)

作用:在動(dòng)畫(huà)片段上增加額外的運(yùn)動(dòng)數(shù)據(jù),可以基于動(dòng)畫(huà)狀態(tài)來(lái)控制其他的物體(如控制角色在冷天的呼氣)。

一般要將動(dòng)畫(huà)片段與相應(yīng)的參數(shù)進(jìn)行綁定,然后通過(guò)腳本進(jìn)行控制。在動(dòng)畫(huà)的Curves(曲線(xiàn))屬性中進(jìn)行控制,先設(shè)置一個(gè)曲線(xiàn),然后編寫(xiě)需要的腳本,綁定到對(duì)應(yīng)游戲?qū)ο?,將需要根?jù)動(dòng)畫(huà)變換的物體綁定到腳本。

動(dòng)畫(huà)層(Animation Layer)

作用:如為不同身體部位使用不同的動(dòng)畫(huà)狀態(tài)機(jī)(就比如下半身在跑步,而上半身在進(jìn)行射擊的動(dòng)作),

在不同層級(jí)之間復(fù)用動(dòng)畫(huà)狀態(tài)機(jī)。(如角色受傷后動(dòng)作有改變,但是動(dòng)畫(huà)邏輯未改變)

還可以嫁接不同身體部位,得到新的動(dòng)畫(huà)。

遮罩Mask

為動(dòng)畫(huà)層設(shè)定受該層動(dòng)畫(huà)影響的部位,一般是綠色表示時(shí)候影響,紅色不受影響。

在動(dòng)畫(huà)控制器中新建圖層,為不同的圖層添加動(dòng)畫(huà),可以通過(guò)調(diào)整動(dòng)畫(huà)的權(quán)重來(lái)進(jìn)行不同動(dòng)畫(huà)的融化。使游戲?qū)ο罂梢宰龀龈匀坏膭?dòng)作。

在project窗口中,新建一個(gè)Avatar Mask(遮罩),將不用的部分點(diǎn)掉,添加到圖層中,播放該圖層的動(dòng)畫(huà)時(shí),紅色的部分就不會(huì)受當(dāng)前動(dòng)畫(huà)的影響,而使用其他層的動(dòng)畫(huà)。

還可以添加交互功能(當(dāng)用戶(hù)進(jìn)行操作后,修改動(dòng)畫(huà)層的權(quán)重),新建腳本,編輯后將其添加給游戲?qū)ο蟆?/p>

逆向運(yùn)動(dòng)學(xué)(IK)

利用骨骼動(dòng)畫(huà),實(shí)現(xiàn)角色和游戲場(chǎng)景進(jìn)行實(shí)時(shí)交互的技術(shù)。

正向運(yùn)動(dòng)學(xué):實(shí)現(xiàn)骨骼動(dòng)畫(huà)最簡(jiǎn)單的方法,從根節(jié)點(diǎn)開(kāi)始(骨骼的關(guān)系一般為樹(shù)狀結(jié)構(gòu)),然后將骨骼的變換逐層傳遞給子孫節(jié)點(diǎn),當(dāng)在骨骼上綁定物體的時(shí)候使用正向運(yùn)動(dòng)學(xué)會(huì)比較方便(如在游戲中技術(shù)射出弓箭,要求弓箭射中敵人后要粘到敵人身上。

但正向運(yùn)動(dòng)學(xué)無(wú)法解決游戲人物和環(huán)境實(shí)時(shí)交互的問(wèn)題。(一般只能播放事先準(zhǔn)備好的骨骼動(dòng)畫(huà))

逆向運(yùn)動(dòng)學(xué)一般只知道末端骨骼的姿態(tài),然后反向計(jì)算其他骨骼的信息。

響應(yīng)函數(shù):OnAnimatorIK

要使角色能夠響應(yīng)IK,需在圖層中將IK處理勾選上。

//使角色看向鼠標(biāo)移動(dòng)的方向
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IK : MonoBehaviour
{
? ?protected Animator animator;
? ?// Start is called before the first frame update
? ?void Start()
? ?{
? ? ? ?animator = GetComponent<Animator>();
? ?}

? ?// Update is called once per frame
? ?void Update()
? ?{
? ? ? ?
? ?}
? ?private void OnAnimatorIK(int layerIndex)
? ?{
? ? ? ?Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
? ? ? ?float enter = 0f;
? ? ? ?Plane palne = new Plane(Vector3.up, transform.position);
? ? ? ?Vector3 target;
? ? ? ?if(palne.Raycast(ray,out enter))
? ? ? ?{
? ? ? ? ? ?target = ray.GetPoint(enter);
? ? ? ? ? ?animator.SetLookAtWeight(0.5f,0.3f,0.8f,1);//修改多部位的權(quán)重,使角色的動(dòng)作看起來(lái)更自然
? ? ? ? ? ?animator.SetLookAtPosition(target);
? ? ? ?}
? ?}
}


//使角色的手或腳可以盡量靠近某個(gè)物體,如建立一個(gè)球,在球上方新建一個(gè)空對(duì)象Hint,將球和Hint對(duì)象拖拽給游戲?qū)ο髮?duì)應(yīng)的腳本中參數(shù)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IK2 : MonoBehaviour
{
? ?protected Animator animator;
? ?public Transform target;
? ?public Transform hint;
? ?public bool isHand = true;
? ?// Start is called before the first frame update
? ?void Start()
? ?{
? ? ? ?animator = GetComponent<Animator>();
? ?}

? ?// Update is called once per frame
? ?void Update()
? ?{
? ? ? ?
? ?}
? ?private void OnAnimatorIK(int layerIndex)
? ?{
? ? ? ?AvatarIKGoal g = isHand ? AvatarIKGoal.RightHand : AvatarIKGoal.RightFoot;
? ? ? ?AvatarIKHint h = isHand ? AvatarIKHint.RightElbow : AvatarIKHint.RightKnee;
? ? ? ?animator.SetIKPositionWeight(g, 1f);
? ? ? ?animator.SetIKPosition(g, target.position);
? ? ? ?animator.SetIKRotationWeight(g, 1f);
? ? ? ?animator.SetIKRotation(g, target.rotation);

? ? ? ?animator.SetIKHintPositionWeight(h, 1f);
? ? ? ?animator.SetIKHintPosition(h, hint.position);
? ?}
}

子狀態(tài)

把一系列動(dòng)作組成的復(fù)合動(dòng)作看作一個(gè)子狀態(tài),再將子狀態(tài)融入到動(dòng)畫(huà)狀態(tài)機(jī)中,便于管理(分而治之),比如游戲中的沖刺攻擊,包含了快跑,跳躍和攻擊三個(gè)動(dòng)畫(huà)(即是一個(gè)子狀態(tài))。

在動(dòng)畫(huà)狀態(tài)機(jī)中右鍵創(chuàng)建子狀態(tài)機(jī),雙擊打開(kāi)編輯子狀態(tài)機(jī)。在子狀態(tài)機(jī)的動(dòng)畫(huà)播放完之后,需要轉(zhuǎn)回到Base Layer(基礎(chǔ)圖層)中(在子狀態(tài)的動(dòng)畫(huà)機(jī)中最后轉(zhuǎn)到(up)Base Layer),然后將動(dòng)畫(huà)轉(zhuǎn)New StateMachine(即新的子狀態(tài)動(dòng)畫(huà)機(jī)中),建立一個(gè)觸發(fā)器(trigger)類(lèi)型的參數(shù),建立一個(gè)腳本來(lái)確定觸發(fā)條件(如當(dāng)用戶(hù)按下空格時(shí))。

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

public class SubState : MonoBehaviour
{
? ?// Start is called before the first frame update
? ?void Start()
? ?{
? ? ? ?
? ?}

? ?// Update is called once per frame
? ?void Update()
? ?{
? ? ? ?if(Input.GetKeyDown(KeyCode.Space))
? ? ? ?{
? ? ? ? ? ?GetComponent<Animator>().SetTrigger("start");
? ? ? ?}
? ? ? ?
? ?}
}


融合樹(shù)(Blend Tree)

對(duì)兩個(gè)或者多個(gè)相似運(yùn)動(dòng)進(jìn)行融合(最明顯的例子就是走路和跑步運(yùn)動(dòng),即隨著角色移動(dòng)速度的提高,來(lái)從走路過(guò)渡到跑步?;蛘咴谶\(yùn)動(dòng)時(shí),轉(zhuǎn)彎的身體偏向)

<與之類(lèi)似的>transition(動(dòng)畫(huà)過(guò)渡):是在一定的時(shí)間內(nèi)平滑的從一個(gè)動(dòng)畫(huà)狀態(tài)過(guò)渡至另一個(gè)狀態(tài)(如果在短時(shí)間內(nèi)完成可以接受),未產(chǎn)生新的動(dòng)畫(huà),而B(niǎo)lend Tree融合樹(shù)允許多動(dòng)畫(huà)平滑混合成新的動(dòng)畫(huà)(多個(gè)動(dòng)作同時(shí)對(duì)生成的動(dòng)作產(chǎn)生影響,依靠參數(shù)控制不同動(dòng)作的權(quán)重)

在動(dòng)畫(huà)狀態(tài)機(jī)中,右鍵中新建New Blend Tree,雙擊進(jìn)入其界面,在右面的屬性界面里可以將動(dòng)畫(huà)直接拖拽給Blend Tree,運(yùn)行游戲,在動(dòng)畫(huà)狀態(tài)機(jī)中調(diào)整Blend的數(shù)值,可以看到角色在不同的動(dòng)畫(huà)狀態(tài)中過(guò)渡,變化。在Blend tree 的屬性界面可以更改動(dòng)畫(huà)的混合類(lèi)型(默認(rèn)為1D,即一維),可以調(diào)整為Direct(直接),然后新建參數(shù),賦給動(dòng)畫(huà)(在Blend tree中修改動(dòng)畫(huà)的Paramete)。

Blend Tree的動(dòng)畫(huà)混合類(lèi)型2D Freeform Cartesian(二維的混合方式):新建多個(gè)運(yùn)動(dòng)域后。一般要調(diào)整Pos X,PosY的數(shù)值,用來(lái)調(diào)整運(yùn)動(dòng)區(qū)域,使其比較均勻(基本上可以理解為二維坐標(biāo)系)。(在最面還有一個(gè)鏡像,勾選后對(duì)于對(duì)稱(chēng)來(lái)說(shuō)該狀態(tài)仍有效),還需要新建參數(shù)賦給Parameters(我理解為權(quán)重)

//該段代碼實(shí)現(xiàn)了用戶(hù)可以通過(guò)上下左右來(lái)操作角色(通過(guò)動(dòng)畫(huà)的融合樹(shù)來(lái)實(shí)現(xiàn)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

public class BT : MonoBehaviour
{
? ?Animator animator = null;
? ?// Start is called before the first frame update
? ?void Start()
? ?{
? ? ? ?animator = GetComponent<Animator>();
? ?}

? ?// Update is called once per frame
? ?void Update()
? ?{
? ? ? ?float h = CrossPlatformInputManager.GetAxis("Horizontal");
? ? ? ?float v = CrossPlatformInputManager.GetAxis("Vertical");
? ? ? ?Vector3 move = v * Vector3.forward + h * Vector3.right;
? ? ? ?if(Input.GetKey(KeyCode.LeftShift))
? ? ? ?{
? ? ? ? ? ?move.z *= 0.5f;
? ? ? ?}
? ? ? ?float turn = move.x;
? ? ? ?float forward = move.z;
? ? ? ?animator.SetFloat("speed", forward, 0.1f, Time.deltaTime);
? ? ? ?animator.SetFloat("turn", turn, 0.1f, Time.deltaTime);
? ?}
}

目標(biāo)匹配(Match Target)

用途:如角色在運(yùn)動(dòng)時(shí),手或腳在特定時(shí)間到達(dá)特定位置(比如角色跳過(guò)石頭的時(shí)候腳需要踩在石頭上,跳起來(lái)夠著某個(gè)頭頂?shù)臇|西),通常使用目標(biāo)匹配的功能來(lái)影響角色的姿態(tài),調(diào)整事先制作的動(dòng)畫(huà),達(dá)到特定效果。


//讓角色跳到某個(gè)指定位置(一般是需要在物體上方放置空對(duì)象)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MUBIAOPP : MonoBehaviour
{
? ?Animator animator;
? ?public Transform rightFoot;
? ?AnimatorStateInfo animState;
? ?public float matchStart;//進(jìn)行目標(biāo)匹配的開(kāi)始與結(jié)束時(shí)間,一般需要在unity中調(diào)整開(kāi)始結(jié)束時(shí)間(范圍0~1),是角色的動(dòng)作看起來(lái)更自然。
? ?public float matchEnd;
? ?// Start is called before the first frame update
? ?void Start()
? ?{
? ? ? ?animator = GetComponent<Animator>();
? ?}

? ?// Update is called once per frame
? ?void Update()
? ?{
? ? ? ?if(animator !=null)
? ? ? ?{
? ? ? ? ? ?animState = animator.GetCurrentAnimatorStateInfo(0);
? ? ? ? ? ?if (Input.GetButton("Fire1")) animator.SetTrigger("jump");
? ? ? ? ? ?if(animState.IsName("JUMP00"))//IsName中的參數(shù)為需要進(jìn)行目標(biāo)匹配的動(dòng)畫(huà)
? ? ? ? ? ?{
? ? ? ? ? ? ? ?animator.SetTrigger("jump");
? ? ? ? ? ? ? ?animator.MatchTarget(rightFoot.position, rightFoot.rotation, AvatarTarget.RightFoot,
? ? ? ? ? ? ? ? ? ?new MatchTargetWeightMask(Vector3.one, 1), matchStart, matchEnd);
? ? ? ? ? ?}
? ? ? ?}
? ?}
}








Unity基礎(chǔ)學(xué)習(xí)筆記01界面與動(dòng)畫(huà)系統(tǒng)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
厦门市| 双城市| 绩溪县| 南京市| 浦县| 白河县| 阿荣旗| 来凤县| 大关县| 高清| 定州市| 穆棱市| 德兴市| 武鸣县| 潼南县| 大新县| 九龙坡区| 商洛市| 盐山县| 时尚| 灵武市| 碌曲县| 乌兰县| 曲靖市| 屯昌县| 来凤县| 鹤山市| 郎溪县| 苏尼特右旗| 巢湖市| 富裕县| 鲜城| 陕西省| 乐山市| 孟州市| 阿鲁科尔沁旗| 邮箱| 文昌市| 平顶山市| 漠河县| 伽师县|