美文网首页
unity官方案例--坦克大战(六)

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

作者: 随便走走侃侃 | 来源:发表于2017-07-23 06:14 被阅读212次

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

    选择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模型,并点击上面的应用。

    相关文章

      网友评论

          本文标题:unity官方案例--坦克大战(六)

          本文链接:https://www.haomeiwen.com/subject/oqxyvttx.html