坦克創(chuàng)建
在Models文件夾中,找到名為T(mén)ank的模型并將它拖到Hierarchy面板當(dāng)中。在Inspect面板中撒汉,設(shè)置Tank對(duì)象的Layer值為Players,并在彈出的改變Layer對(duì)話框中選擇No,this object only。給坦克模型增加一個(gè)Rigidbody組件。展開(kāi)組件的Constraints區(qū)域塞淹,在這個(gè)下面選擇Freeze Position Y軸,Freeze Rotation X、Z軸罪裹。
增加一個(gè)Box Collider組件到坦克模型饱普,并將Box Collider組件的Center改為(0,.85,0)运挫,將Size改為(1.5,1.7套耕,1.6)谁帕。
增加一個(gè)Audio Source組件到坦克模型。通過(guò)Audio Clip旁邊的小圓鈕將Audio Source組件的Audio Clip屬性改為EngineIdle冯袍,然后選擇Loop匈挖。然后運(yùn)行后坦克就會(huì)有發(fā)動(dòng)機(jī)的聲音了。
再增加一個(gè)Audio Source組件康愤,將第二個(gè)Audio Souce組件不勾選Play On Awake儡循;
選擇Project中的Prefabs文件夾,將hierarchy面板中的Tank對(duì)象拖到Prefabs中征冷,保存場(chǎng)景择膝。
從Prefabs文件夾中拖拽DustTrail到Tank對(duì)象中,成為T(mén)ank對(duì)象的子對(duì)象检激。復(fù)制DustTrail對(duì)象肴捉,使他變成兩個(gè)。并將一個(gè)重命名為L(zhǎng)eftDustTrail,另一個(gè)命名為RightDustTrail,將LeftDustTrail的Position屬性改為(-0.5,0,0.75)呵扛,RightDustTrail的Position屬性改為(0.5,0,0.75)每庆。
在Scripts/Tank文件夾下找到,TankMovement腳本今穿,將它拖到Tank對(duì)象里缤灵,并雙擊打開(kāi)TankMovement腳本。
這個(gè)腳本主要是實(shí)現(xiàn)4個(gè)功能
1.獲取輸入
2.設(shè)置聲音
3.設(shè)置前進(jìn)蓝晒、后退移動(dòng)
4.設(shè)置轉(zhuǎn)彎
下面我們就一個(gè)個(gè)來(lái)實(shí)現(xiàn)
private float m_MovementInputValue=0f; //定義當(dāng)前移動(dòng)物體輸入的值
private float m_TurnInputValue=0f;? //定義轉(zhuǎn)變物體角度的值? 初始都為0
private Rigidbody m_Rigidbody;? //坦克的剛體對(duì)象
private void Awake()? ? {? ? ?
? ? ? ? ? m_Rigidbody = GetComponent<Rigidbody>();
}腮出;//獲取物體剛體組件
在Update函數(shù)中
m_MovementInputValue = Input.GetAxis("Vertical1");
m_TurnInputValue = Input.GetAxis("Horizontal1");
private void Move(){
// Adjust the position of the tank based on the player's input.
Vector3 movement = transform.forward*m_MovementInputValue * m_Speed * Time.deltaTime;
? ? ? //創(chuàng)建一個(gè)向量,方向即為坦克面對(duì)方向芝薇,大小為輸入胚嘲、速度和兩幀之間的時(shí)間的乘積m_Rigidbody.MovePosition(m_Rigidbody.position + movement);//移動(dòng)剛體組件,當(dāng)前的坐標(biāo)加上移動(dòng)的向量洛二;
}
private void Turn()
{// Adjust the rotation of the tank based on the player's input.
float turn = m_TurnInputValue * m_TurnSpeed * Time.deltaTime;//旋轉(zhuǎn)的角度
Quaternion turnRatation = Quaternion.Euler(0f, turn, 0f);//繞著Y軸旋轉(zhuǎn)馋劈。
m_Rigidbody.MoveRotation(m_Rigidbody.rotation * turnRatation);//剛體旋轉(zhuǎn)}
而后在FixedUpdate 函數(shù)中調(diào)用Move()和Turn()函數(shù);
現(xiàn)在我們的坦克模型應(yīng)該是可以移動(dòng)了晾嘶。
接下來(lái)妓雾,我們往坦克里面添加不同狀態(tài)的聲音,
private float m_OriginalPitch;//定義float型變量用于存儲(chǔ)原始音樂(lè)音量大小垒迂,并在start函數(shù)中進(jìn)行賦值械姻,
m_OriginalPitch=m_MovementAudio.pitch;
private void EngineAudio()
{
// Play the correct audio clip based on whether or not the tank is moving and what audio is currently playing.
//當(dāng)坦克禁止不動(dòng)時(shí);
if (Mathf.Abs(m_MovementInputValue) < 0.1f && Mathf.Abs(m_TurnInputValue) < 0.1f)
{
if (m_MovementAudio.clip == m_EngineDriving)
{
m_MovementAudio.clip = m_EngineIdling;
m_MovementAudio.pitch = Random.Range(m_OriginalPitch - m_PitchRange, m_PitchRange + m_OriginalPitch);
m_MovementAudio.Play();
}}
else {//當(dāng)坦克走動(dòng)時(shí)
if (m_MovementAudio.clip == m_EngineIdling) {
m_MovementAudio.clip = m_EngineDriving;
m_MovementAudio.pitch = Random.Range(m_OriginalPitch - m_PitchRange, m_OriginalPitch + m_PitchRange);
m_MovementAudio.Play();
}}}
回到Tank Movement(Script).將第一個(gè)Audio Source拖入到Movement Audio參數(shù)旁邊的方框机断。EngineIdling參數(shù)用小圓按鈕選擇EngineIdle楷拳,Engine Driving參數(shù)選擇EngineDriving,然后點(diǎn)擊Inspector面板的最上面進(jìn)行應(yīng)用绣夺。