版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Unity3D技術(shù)學(xué)習(xí)之自由視角下的角色控制今天呢,我們繼續(xù)來探討Unity3D角色控制的內(nèi)容,今天博主將解決在上一篇文章中沒有解決的問題,即自由視角下的角色控制。如圖是博主非常喜歡的古劍奇譚游戲截圖,在這款游戲中就使用了博主今天要講解的自由視角,所謂自由視角是指玩家可以按照自身坐標(biāo)系向著四個(gè)不同的方向移動(dòng),當(dāng)玩家按下鼠標(biāo)右鍵時(shí),可以繞Y軸按照一定的角度旋轉(zhuǎn)攝像機(jī),在旋轉(zhuǎn)的過程中,角色將旋轉(zhuǎn)相應(yīng)的角度。在移動(dòng)的過程中,攝像機(jī)會(huì)保持與玩家間的一定距離,然后跟隨角色進(jìn)行移動(dòng)。好了,下面我們正式開始今天的內(nèi)容吧!在開始今天的內(nèi)容前,首先讓我們來學(xué)習(xí)下Unity3D中較為重要的一部分知識(shí),理解這些知識(shí)
2、是我們開始學(xué)習(xí)今天內(nèi)容的基礎(chǔ)。1、Input.GetAxis():該方法用于在Unity3D中根據(jù)坐標(biāo)軸名稱返回虛擬坐標(biāo)系中的值,通常情況下,使用控制器和鍵盤輸入時(shí)此值范圍在T到1之間。這段話怎么理解呢?我們來看下面這段腳本:usingUnityEngine;usingSystem.Collections;publicclassexample:MonoBehaviour/水平速度publicfloatHorizontalSpeed=2.0F;/垂直速度publicfloatVerticalSpeed=2.0F;voidUpdate()/水平方向floath=HorizontalSpeed*In
3、put.GetAxis(MouseX);/垂直方向floatv=VerticalSpeed*Input.GetAxis(MouseY);/旋轉(zhuǎn)transform.Rotate(v,h,0);這段腳本呢是根據(jù)鼠標(biāo)的位置來旋轉(zhuǎn)物體從而實(shí)現(xiàn)對物體的觀察,從這段腳本中我們可以看出,通過獲取輸入軸的辦法,我們可以獲得鼠標(biāo)移動(dòng)的方向進(jìn)而實(shí)現(xiàn)對于物體的旋轉(zhuǎn)控制。在Unity3D中我們可以通過Edit-ProjectSetting-lnput來查看項(xiàng)目中的坐標(biāo)軸名稱:shift11Gic|_li匚EnfipSettings.-Hie-hsvpqM=inI毀卓SUEDalo:仕1盞譜h-.jgV-電.-.|rM
4、rfi-yrfM=ini?FPSM=inSSEE.G=meCtrl4-DIf!-對f!Sihif+lfJFiarneseleiitdEclcdtAllRzridc皙&ctingsehMnrkHmGraphceEmuationagsandLayersiudij!Ph嚴(yán)g2ENztwDrl:EdiL*ScrptEk二cut匚nOrderi-l-Fmn2hCLockViewtoScactedCtfl-F嚴(yán)*上|件門匚上比-Mod9“-SU5HChkhilL+P3tdIAl-IP在后面,我們還將使用這種方式,大家可以對這個(gè)方法有進(jìn)一步的了解。文章出處【狗刨學(xué)習(xí)網(wǎng)】2、歐拉角eulerAngles:該值
5、是Vector3類型的值,x、y、z分別代表繞x軸旋轉(zhuǎn)x度,繞y軸旋轉(zhuǎn)y度,繞z軸旋轉(zhuǎn)z度。因此,該值最為直觀的形式是可以允許我們直接以一個(gè)三維向量的形式來修改一個(gè)物體的角度,例如下面的腳本:floatmY=5.0;voidUpdate()mY+=Input.GetAxis(Horizontal);transform.eulerAngles=newVector3(0,mY,0);如果你已經(jīng)理解了上面的話,那么不出意外的,這段腳本會(huì)如你所愿的,按照鼠標(biāo)在水平方向上移動(dòng)的方向繞Y軸旋轉(zhuǎn)。通常情況下,我們不會(huì)單獨(dú)設(shè)置歐拉角其中一個(gè)軸,例如eulerAngles.x=10,因?yàn)檫@將導(dǎo)致偏移和不希望的旋
6、轉(zhuǎn)。當(dāng)設(shè)置它們一個(gè)新的值時(shí),要同時(shí)設(shè)置全部。好在我們可以通過Quaternion.Euler()方法將一個(gè)Vector3類型的值轉(zhuǎn)化為一個(gè)四元數(shù),進(jìn)而通過修改Transform.Rotation來實(shí)現(xiàn)相同的目的。3、插值:所謂插值是指在離散數(shù)據(jù)的基礎(chǔ)上補(bǔ)插連續(xù)函數(shù),使得這條連續(xù)曲線通過全部給定的離散數(shù)據(jù)點(diǎn)。插值是離散函數(shù)逼近的重要方法,利用它可通過函數(shù)在有限個(gè)點(diǎn)處的取值狀況,估算出函數(shù)在其他點(diǎn)處的近似值。在某些情況下,如果我們希望過程中處理得較為平滑,此時(shí)我們就可以使用插值的方法來實(shí)現(xiàn)對中間過程的模擬。在Unity3D中我們可以使用兩種插值方法,即線性插值Lerp,球形插值SLerp。我們來看
7、下面的腳本:voidRotating(floathorizontal,floatvertical)/Createanewvectorofthehorizontalandverticalinputs.Vector3targetDirection=newVector3(horizontal,0f,vertical);/Createarotationbasedonthisnewvectorassumingthatupistheglobalyaxis.QuaterniontargetRotation=Quaternion.LookRotation(targetDirection,Vector3.up)
8、;/Createarotationthatisanincrementclosertothetargetrotationfromtheplayersrotation.QuaternionnewRotation=Quaternion.Lerp(rigidbody.rotation,targetRotation,turnSmoothing*Time.deltaTime);/Changetheplayersrotationtothisnewrotation.rigidbody.MoveRotation(newRotation);插值的方法很簡單,只要我們給出初始和結(jié)束的狀態(tài)、時(shí)間就可以了,大家可以自己
9、看API。好了,有了這三部分的基礎(chǔ),我們就可以開始今天的內(nèi)容了,今天的腳本分為兩個(gè)部分,第一部分是角色控制的部分,主要負(fù)責(zé)的角色在場景中的移動(dòng)、轉(zhuǎn)身和動(dòng)畫處理。第二部分是相機(jī)控制的部分,主要涉及相機(jī)旋轉(zhuǎn)、相機(jī)縮放的相關(guān)內(nèi)容。下面,我們分別來講這兩個(gè)部分,場景依然是博主自己在做的小游戲:f丄j本次的主角呢,是博主非常喜歡的角色謝滄行,好了,我們回到今天的內(nèi)容里吧!在第一部分,主要的是完成角色向各個(gè)方向的轉(zhuǎn)身,這里博主定義四個(gè)方向(其實(shí)八個(gè)方向是一樣的?。_本如下:usingUnityEngine;usingSystem.Collections;publicclassNoLockiVew_Pla
10、yer:MonoBehaviour/*自由視角下的角色控制*/*作者:秦兀培*/玩家的行走速度publicfloatWalkSpeed=1.5F;/重力publicfloatGravity=20;/角色控制器privateCharacterControllermController;/動(dòng)畫組件privateAnimationmAnim;/玩家方向,默認(rèn)向前privateDirectionTypemType=DirectionType.Direction_Forward;HideInInspector/玩家狀態(tài),默認(rèn)為IdlepublicPlayerStateState=PlayerState.
11、Idle;/定義玩家的狀態(tài)枚舉publicenumPlayerStateIdle,Walk定義四個(gè)方向的枚舉值,按照逆時(shí)針方向計(jì)算protectedenumDirectionTypeDirection_Forward=90,Direction_Backward=270,Direction_Left=180,Direction_Right=0voidStart()獲取角色控制器mController=GetComponent();/獲取動(dòng)畫組件mAnim=GetComponentInChildren();voidUpdate()MoveManager();/MouseEvent();/玩家移動(dòng)控
12、制voidMoveManager()/移動(dòng)方向Vector3mDir=Vector3.zero;if(mController.isGrounded)/將角色旋轉(zhuǎn)到對應(yīng)的方向if(Input.GetAxis(Vertical)=1)rd);lkSpeed;ard);lkSpeed;SetDirection(DirectionType.Direction_ForwamDir=Vector3.forward*Time.deltaTime*WamAnim.CrossFade(Walk,0.25F);State=PlayerState.Walk;if(Input.GetAxis(Vertical)=-1
13、)SetDirection(DirectionType.Direction_BackwmDir=Vector3.forward*Time.deltaTime*WamAnim.CrossFade(Walk,0.25F);State=PlayerState.Walk;if(Input.GetAxis(Horizontal)=-1)SetDirection(DirectionType.Direction_Left);-mDir=Vector3.forward*Time.deltaTime*WalkSpeed;mAnim.CrossFade(Walk,0.25F);State=PlayerState.
14、Walk;if(Input.GetAxis(Horizontal)=1)SetDirection(DirectionType.Direction_Right);-mDir=Vector3.forward*Time.deltaTime*WalkSpeed;mAnim.CrossFade(Walk,0.25F);State=PlayerState.Walk;/角色的Idle動(dòng)畫if(Input.GetAxis(Vertical)=0&Input.GetAxis(Horizontal)=0)mAnim.CrossFade(Idle,0.25F);State=PlayerState.Idle;/考慮重
15、力因素mDir=transform.TransformDirection(mDir);floaty=mDir.y-Gravity*Time.deltaTime;mDir=newVector3(mDir.x,y,mDir.z);mController.Move(mDir);設(shè)置角色的方向,有問題voidSetDirection(DirectionTypemDir)if(mType!=mDir)這里定義四個(gè)方向,是按照逆時(shí)針方向轉(zhuǎn)的,相鄰的兩個(gè)方向間相差90度,所以我們只需要將當(dāng)前的角度和目標(biāo)角度相減就可以轉(zhuǎn)到目標(biāo)角度的方向(其實(shí)這是以前寫的代碼,現(xiàn)在回頭再看,直接用歐拉角似乎更為簡單啊,呵呵)。
16、這里主要的內(nèi)容就是這樣了。下面我們來看相機(jī)控制部分的代碼吧,這里的代碼參考了MouseOrbit腳本,主要完成了鼠標(biāo)右鍵旋轉(zhuǎn)控制,博主在此基礎(chǔ)上增加了相機(jī)縮放的代碼。提到相機(jī)縮放,其實(shí)就是根據(jù)鼠標(biāo)滾輪滾動(dòng)的方向和大小重新計(jì)算角色與相機(jī)的距離,與之類似地還有小地圖的放縮,其實(shí)同樣是通過修改距離來實(shí)現(xiàn)的。博主今天的一個(gè)體會(huì)是官方的代碼能自己寫一遍的最好自己寫一遍,這樣好多東西就能在這個(gè)過程中給理解了。我們一起來看腳本usingUnityEngine;usingSystem.Collections;publicclassNoLockView_Camera:MonoBehaviour/觀察目標(biāo)publ
17、icTransformTarget;/觀察距離publicfloatDistance=5F;/旋轉(zhuǎn)速度privatefloatSpeedX=240;privatefloatSpeedY=120;/角度限制privatefloatMinLimitY=5;privatefloatMaxLimitY=180;/旋轉(zhuǎn)角度privatefloatmX=0.0F;privatefloatmY=0.0F;/鼠標(biāo)縮放距離最值privatefloatMaxDistance=10;privatefloatMinDistance=1.5F;/鼠標(biāo)縮放速率privatefloatZoomSpeed=2F;/是否啟用差
18、值publicboolisNeedDamping=true;/速度publicfloatDamping=2.5F;voidStart()/初始化旋轉(zhuǎn)角度mX=transform.eulerAngles.x;mY=transform.eulerAngles.y;voidLateUpdate()/鼠標(biāo)右鍵旋轉(zhuǎn)if(Target!=null&Input.GetMouseButton(1)/獲取鼠標(biāo)輸入mX+=Input.GetAxis(MouseX)*SpeedX*0.02F;mY-=Input.GetAxis(MouseY)*SpeedY*0.02F;/范圍限制mY=ClampAngle(mY,M
19、inLimitY,MaxLimitY);/鼠標(biāo)滾輪縮放Distance-=Input.GetAxis(MouseScrollWheel)*ZoomSpeed;Distance=Mathf.Clamp(Distance,MinDistance,MaxDistance);/重新計(jì)算位置和角度QuaternionmRotation=Quaternion.Euler(mY,mX,0);istance)Vector3mPosition=mRotation*newVector3(0.0F,0.0F,-D+Target.position;/設(shè)置相機(jī)的角度和位置if(isNeedDamping)/球形插值tr
20、ansform.rotation=Quaternion.Lerp(transform.rotation,mRotation,Time.deltaTime*Damping);/線性插值transform.position=Vector3.Lerp(transform.position,mPosition,Time.deltaTime*Damping);elsetransform.rotation=mRotation;transform.position=mPosition;/將玩家轉(zhuǎn)到和相機(jī)對應(yīng)的位置上if(Target.GetComponent().State=NoLockiVew_Player.PlayerState.Walk)Target.eulerAngles=newVector3(0,mX,0);privatefloatClampAngle(floatangle,floatmin,floatmax)if(angle360)angle-=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 職業(yè)學(xué)院教職工申訴工作實(shí)施辦法
- 2024裝飾項(xiàng)目工程承包合同版
- 2024年高性能潤滑油品采購綜合合同版B版
- 2024年項(xiàng)目融資合同標(biāo)的及還款方式
- 2025年度數(shù)據(jù)安全與隱私保護(hù)服務(wù)合同范本3篇
- 2024年鮮雞蛋采購與銷售協(xié)議
- 2024年餐飲合伙人:合作協(xié)議3篇
- 2024年銷售協(xié)議規(guī)則詳解與實(shí)施流程版
- 2024年節(jié)能門窗供應(yīng)合同
- 2020年咨詢工程師繼續(xù)教育信息化和工業(yè)化融合83分
- 浙江省金華市(2024年-2025年小學(xué)五年級語文)人教版質(zhì)量測試((上下)學(xué)期)試卷及答案
- 傳媒行業(yè)突發(fā)事件應(yīng)急預(yù)案
- 2024年《工會(huì)法》知識(shí)競賽題庫及答案
- 《中國血脂管理指南》考試復(fù)習(xí)題庫(含答案)
- 人教版道德與法治八年級上冊2.1網(wǎng)絡(luò)改變世界課件
- 外研版小學(xué)英語(三起點(diǎn))六年級上冊期末測試題及答案(共3套)
- 中醫(yī)診療規(guī)范
- 工業(yè)互聯(lián)網(wǎng)平臺(tái) 安全生產(chǎn)數(shù)字化管理 第2部分:石化化工行業(yè) 編制說明
- 第14課《葉圣陶先生二三事》導(dǎo)學(xué)案 統(tǒng)編版語文七年級下冊
- 成人手術(shù)后疼痛評估與護(hù)理-中華護(hù)理學(xué)會(huì)團(tuán)體標(biāo)準(zhǔn)2023 2
- DB15-T 3585-2024 高標(biāo)準(zhǔn)農(nóng)田施工質(zhì)量評定規(guī)程
評論
0/150
提交評論