Unity手遊之路《七》角色控制器

2021-08-27 15:52:40 字數 3879 閱讀 2312

我們要控制角色的移動,可以全部細節都由自己來實現。控制角色模型的移動,同時移動攝影機,改變視角。當然unity也提供了一些元件,可以讓我們做更少的工作,實現我們所期望的功能。今天我們就一起系統來學習相關的內容吧。

"角色控制器允許你在受制於碰撞的情況下很容易的進行運動,而不用處理剛體。角色控制器不受力的影響,僅僅當你呼叫move函式時才運動。然後它將執行運動,但是受制於碰撞。"(---from unity3d官方文件) 我們通常在人物模型上加上這個元件後,就可以控制模型的移動了。要注意的一點是。加了角色控制器後,他就不受重力影響。所以要自己在move函式中處理重力的情況。即我們要自己出來y軸方向上的速度變化。

1.function ******move (speed : vector3) : bool

以一定的速度移動。將忽略y軸上的速度。單位是m/s。重力被自動應用。建議每幀只呼叫一次move或者******move。返回值是是否著地。

例子

charactercontroller controller= getcomponent();

vector3 forward= transform.transformdirection(vector3.forward);

float curspeed = speed * input.getaxis ("vertical");

ontroller.******move(forward * curspeed);

2.function move (motion : vector3) : collisionflags通過動力來移動控制器。動力只受限制於碰撞。它將沿著碰撞器滑動。這個函式不應用任何重力

如果只是單純控制玩家的移動,那麼用character controller足夠了。如果還涉及到視角的切換。unity提供了相關的元件。在專案中引入character controller(asset->import asset),就可以將角色控制器元件匯入我們的專案了。

經典的遊戲cs就是第一人稱視角的,攝像機就是我們的視角。人物的移動,導致視角的移動。(原始碼first.unity)

1.刪除預設的攝像機

2.新建乙個地形terrain

3.從角色控制器元件中引入 first person controller到專案中

4.拖動first person controller到合適的位置

我們就可以看到效果了,以第一人稱的視角移動,巡視整個場景。滑鼠控制整體視角,方向鍵或者wasd按鈕控制攝像機的移動。

很多角色扮演遊戲(wow,dota)常用到第三人稱視角。攝像機離我們的角色保持有一定距離,可以詳細看到我們所扮演角色的各種行為動作。(原始碼third.unity)

1.建立乙個地形

2.引入3rd person controller元件到專案中

3.修改預設攝像機的tag為maincamera

4.選中3rd person controller元件,將其 third person camera 設定為maincamera

可以看到效果了,可以看到扮演的角色。方向鍵或者wasd按鍵可以控制角色的移動,同時可以發現整個視角也會跟著移動

效果圖

第一人稱控制器指令碼fpsinputcontroller.js

function update () 

// 設定移動的方向

motor.inputmovedirection = transform.rotation * directionvector;

//設定跳躍(預設鍵盤是空格鍵)

motor.inputjump = input.getbutton("jump");

}

第三人稱角色控制器thirdpersoncontroller.js

function update() 

//按了跳躍鍵

if (input.getbuttondown ("jump"))

//控制角色的方向

updatesmoothedmovementdirection();

//處理重力

// 處理跳躍邏輯

//計算實際的動作(移動方向和重力方向的)

var movement = movedirection * movespeed + vector3 (0, verticalspeed, 0) + inairvelocity;

movement *= time.deltatime;

// 移動角色

var controller : charactercontroller = getcomponent(charactercontroller);

collisionflags = controller.move(movement);

// 動畫處理

if(_animation) else

} else

else

else if(_characterstate == characterstate.trotting)

else if(_characterstate == characterstate.walking) }}

}//在地上

if (isgrounded())

else

} // 跳躍狀態,剛好到達地面

if (isgrounded())}}

第三人控制器攝像機指令碼thirdpersoncamera.js

// normal 攝像機動作

else

// 向後走的時候鎖住攝像機

if (angledistance (currentangle, targetangle) > 160 && controller.ismovingbackwards ())

targetangle += 180;//旋轉180

//插值改變相機角度

currentangle = mathf.smoothdampangle(currentangle, targetangle, anglevelocity, angularsmoothlag, angularmaxspeed);

} //當跳躍時

// when jumping don't move camera upwards but only down!

if (controller.isjumping ())

// 走動時,改變高度

else

// 計算當前高度

var currentheight = cameratransform.position.y;

currentheight = mathf.smoothdamp (currentheight, targetheight, heightvelocity, heightsmoothlag);

// 按角度旋轉、

var currentrotation = quaternion.euler (0, currentangle, 0);

//更新相機位置

cameratransform.position = targetcenter;

cameratransform.position += currentrotation * vector3.back * distance;

// 設定相機的高度

cameratransform.position.y = currentheight;

//攝像機一直朝向目標

setuprotation(targetcenter, targethead);}

角色控制,可以方便的控制遊戲的視角。在很多遊戲中,可以直接使用該元件,減少我們的重複開發工作

騰訊手遊效能優化之路

2017 qcon 移動專項最佳實踐 專題講師 何純 圖 2017 qcon全球軟體開發大會現場 經過3 5年的高速發展後,人口紅利正在逐漸消失,ip效應也在減弱 從2016年top10的遊戲來看,主要是競技類和rpg類為主,手遊已逐漸進入到重度的時代,玩法和使用者體驗決定了遊戲的生死,也決定了產品...

Unity手遊引擎安全解析及實踐

近日,由unity主辦的 unity技術開放日 在廣州成功舉辦,網易移動安全技術專家卓輝作為特邀嘉賓同現場400名遊戲開發者分享了網易在手遊安全所積累的經驗。當下,很多手遊背後都存在靠汲取開發商利益的灰色產業鏈,它們通過破解,對遊戲進行重打包達到修改支付 修改廣告等目的。通過利用外掛程式 篡改資料 ...

unity手遊使用terrian注意事項

1.terrain比較佔效能,普通機器測試,未開terrain 60幀,開啟terrain後 30幀 2.terrain的size大小與占用效能無關,不過越小的terrain的烘焙上去的陰影越模糊,剛開始建議烘焙測試下 3.使用terrain建立一條河道時,攝像機鏡頭拉近拉遠會出現鋸齒,此時調節pi...