unity官方案例--坦克大战(二)

坦克创建

在Models文件夹中,找到名为Tank的模型并将它拖到Hierarchy面板当中。在Inspect面板中,设置Tank对象的Layer值为Players,并在弹出的改变Layer对话框中选择No,this object only。给坦克模型增加一个Rigidbody组件。展开组件的Constraints区域,在这个下面选择Freeze Position Y轴,Freeze Rotation X、Z轴。

unity官方案例--坦克大战(二)_第1张图片
2.1 Rigidbody

增加一个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();

};//获取物体刚体组件

在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面板的最上面进行应用。

你可能感兴趣的:(unity官方案例--坦克大战(二))