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

这一篇文章,我们将学习坦克如何射击

选择Hierarchy的Tank对象,右键选择Tank对象然后选择Created Empty。重命名为FireTransform。设置Position为(0,1.7,1.35),Rotation为(350,0,0)。


unity官方案例--坦克大战(六)_第1张图片
图6.1 Transform设置

右键选择Hierarchy面板的Canvas,并选择UI下的Slider,将Slider重命名为AimSlider。按住Alt键选择AimSlider旁边的箭头进行展开,删除Background和Handle Slide Area对象。重新选择AimSlider对象找到Slider组件。

unity官方案例--坦克大战(六)_第2张图片
图6.2 slider component

不勾选Interactable,设置Transition为None,设置Direction为Buttom To Top。设置Min Value为15,Max Value为30。如图6.2所示。

同时选中AimSlider和其子对象FillArea。

展开Fill Area然后选择Fill,在Rect Transform中,设置Hight为0,将Fill对象的Image组件使用小圆钮选择名为Aim Arrow的图片资源,使用Rect Tool(快捷键为T)对边框的左右进行拖拉,使他和坦克模型一样宽,将AmiSlider的Rect Transform的left、Top、PosZ、Right、Bottom设置为(1,-9,-1,1,3)。

下面我们给坦克新建一个脚本,命名为shooting。脚本实现的功能有

1.检测开火按钮的状态;

2.更新发射命令;

3.当发射按钮释放或者达到最大充电时,生成炮弹。

下面实现代码如下:

public int m_PlayerNumber = 1;//玩家数量

public Rigidbody  m_Shell;//炮弹实体

public Transform m_FireTranform;//发射口

public AudioSource m_ShootingAudio;//发射时的声音

public AudioClip m_FireClip;//飞行过程的声音

public float m_MinLaunchForce = 15f;//最小的发射力

public float m_MaxLaunchForce = 30f;//最大发射力

public Slider m_AimSlider;//箭头层

public AudioClip m_ChargingClip;

public float m_MaxChargeTime=0.75f;

private bool m_Fired;

private string m_FireButton;

private float m_CurrentLaunchForce;

private float m_ChargeSpeed;

private void OnEnable() {

Debug.Log("启动");

//当坦克启动时,重设发射力和UI。

m_CurrentLaunchForce = m_MinLaunchForce;

m_AimSlider.value = m_MinLaunchForce;

}

// Use this for initialization

void Start () {

m_FireButton = "Fire" + m_PlayerNumber;

m_ChargeSpeed = (m_MaxLaunchForce - m_MinLaunchForce) /m_MaxChargeTime;//发射力,越久发射的越远

}

// Update is called once per frame

void Update () {

m_AimSlider.value = m_MinLaunchForce;

if (m_CurrentLaunchForce >= m_MaxLaunchForce && !m_Fired)

{

m_CurrentLaunchForce = m_MaxLaunchForce;

Fire();

}

else if (Input.GetButtonDown(m_FireButton))

{

m_Fired = false;

m_CurrentLaunchForce = m_MinLaunchForce;

m_ShootingAudio.clip = m_ChargingClip;

m_ShootingAudio.Play();

}

else if (Input.GetButton(m_FireButton) && !m_Fired)

{

m_CurrentLaunchForce += m_ChargeSpeed * Time.deltaTime;

m_AimSlider.value = m_CurrentLaunchForce;

}

else if (Input.GetButtonUp(m_FireButton) && !m_Fired) {

Fire();

}

}

private void Fire() {

m_Fired = true;//每次开火只能调用一次;

Rigidbody shellInstance=Instantiate(m_Shell, m_FireTranform.position, m_FireTranform.rotation) as Rigidbody ; //初始化炮弹,并存储到rigidbody中。

shellInstance.velocity = m_CurrentLaunchForce * m_FireTranform.forward;//设置炮弹发射速度。

m_ShootingAudio.clip = m_FireClip;

m_ShootingAudio.Play();//改变发射时的声音。

m_CurrentLaunchForce = m_MinLaunchForce;//设置发射时的力。

}


然后找到Shell预制体,将其拖入到Shell参数方框中,找到FIreTransform,将其拖入到FireTransform参数中,找到Canvas子对象并将AimSlider拖入到AimSlider参数中,找到坦克的第二个Audio Source(没有音乐的clip,Loop和Play On Awake属性也没有勾选的),将其拖入到Shooting Audio参数当中。用小圆钮将Charging Clip的值设为FireClip,同样的方法,将Fire Clip 设置为ShotFiring。选择Tank模型,并点击上面的应用。

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