这一篇文章,我们将学习坦克如何射击
选择Hierarchy的Tank对象,右键选择Tank对象然后选择Created Empty。重命名为FireTransform。设置Position为(0,1.7,1.35),Rotation为(350,0,0)。
图6.1 Transform设置右键选择Hierarchy面板的Canvas,并选择UI下的Slider,将Slider重命名为AimSlider。按住Alt键选择AimSlider旁边的箭头进行展开,删除Background和Handle Slide Area对象。重新选择AimSlider对象找到Slider组件。
图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模型,并点击上面的应用。
网友评论