坦克创建
在Models文件夹中,找到名为Tank的模型并将它拖到Hierarchy面板当中。在Inspect面板中,设置Tank对象的Layer值为Players,并在弹出的改变Layer对话框中选择No,this object only。给坦克模型增加一个Rigidbody组件。展开组件的Constraints区域,在这个下面选择Freeze Position Y轴,Freeze Rotation X、Z轴。
增加一个Box Collider组件到坦克模型,并将Box Collider组件的Center改为(0,.85,0),将Size改为(1.5,1.7,1.6)。
增加一个Audio Source组件到坦克模型。通过Audio Clip旁边的小圆钮将Audio Source组件的Audio Clip属性改为EngineIdle,然后选择Loop。然后运行后坦克就会有发动机的声音了。
再增加一个Audio Source组件,将第二个Audio Souce组件不勾选Play On Awake;
选择Project中的Prefabs文件夹,将hierarchy面板中的Tank对象拖到Prefabs中,保存场景。
从Prefabs文件夹中拖拽DustTrail到Tank对象中,成为Tank对象的子对象。复制DustTrail对象,使他变成两个。并将一个重命名为LeftDustTrail,另一个命名为RightDustTrail,将LeftDustTrail的Position属性改为(-0.5,0,0.75),RightDustTrail的Position属性改为(0.5,0,0.75)。
在Scripts/Tank文件夹下找到,TankMovement脚本,将它拖到Tank对象里,并双击打开TankMovement脚本。
这个脚本主要是实现4个功能
1.获取输入
2.设置声音
3.设置前进、后退移动
4.设置转弯
下面我们就一个个来实现
private float m_MovementInputValue=0f; //定义当前移动物体输入的值
private float m_TurnInputValue=0f; //定义转变物体角度的值 初始都为0
private Rigidbody m_Rigidbody; //坦克的刚体对象
private void Awake() {
m_Rigidbody = GetComponent<Rigidbody>();
};//获取物体刚体组件
在Update函数中
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;
//创建一个向量,方向即为坦克面对方向,大小为输入、速度和两帧之间的时间的乘积m_Rigidbody.MovePosition(m_Rigidbody.position + movement);//移动刚体组件,当前的坐标加上移动的向量;
}
private void Turn()
{// Adjust the rotation of the tank based on the player's input.
float turn = m_TurnInputValue * m_TurnSpeed * Time.deltaTime;//旋转的角度
Quaternion turnRatation = Quaternion.Euler(0f, turn, 0f);//绕着Y轴旋转。
m_Rigidbody.MoveRotation(m_Rigidbody.rotation * turnRatation);//刚体旋转}
而后在FixedUpdate 函数中调用Move()和Turn()函数;
现在我们的坦克模型应该是可以移动了。
接下来,我们往坦克里面添加不同状态的声音,
private float m_OriginalPitch;//定义float型变量用于存储原始音乐音量大小,并在start函数中进行赋值,
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.
//当坦克禁止不动时;
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 {//当坦克走动时
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).将第一个Audio Source拖入到Movement Audio参数旁边的方框。EngineIdling参数用小圆按钮选择EngineIdle,Engine Driving参数选择EngineDriving,然后点击Inspector面板的最上面进行应用。