[Unity2D]实现子弹射击的脚本

 

    先把子弹做成prefab组件,添加刚体、碰撞器和脚本。

using UnityEngine;
using System.Collections;

public class Rocket : MonoBehaviour 
{
    public GameObject explosion;        // 爆炸的效果Prefab组件(一个爆炸的动画)

    void Start () 
    {
        // 设置两秒钟之后销毁子弹对象
        Destroy(gameObject, 2);
    }

    // 爆炸的方法
    void OnExplode()
    {
        // 创建一个四元数 Quaternion,取一个随机的旋转角度
        // Quaternion.Euler 欧拉角
        // 返回一个旋转角度,绕y轴旋转y度,绕x轴旋转x度,绕z轴旋转z度。
        Quaternion randomRotation = Quaternion.Euler(0f, 0f, Random.Range(0f, 360f));

        // 初始化explosion的实例
        Instantiate(explosion, transform.position, randomRotation);
    }
    
    void OnTriggerEnter2D (Collider2D col) 
    {
        // 如果子弹碰撞到敌人
        if(col.tag == "Enemy")
        {
            // 找到敌人对应的脚本,调用其Hurt方法,敌人掉血
            col.gameObject.GetComponent<Enemy>().Hurt();

            // 调用爆炸方法
            OnExplode();

            // 销毁当前的子弹对象
            Destroy (gameObject);
        }
        // 如果碰撞到补充物体,BombPickup
        else if(col.tag == "BombPickup")
        {
            // 找到其对应的脚本,调用Explode方法,物体爆炸
            col.gameObject.GetComponent<Bomb>().Explode();

            // 销毁碰撞的物体对象
            Destroy (col.transform.root.gameObject);

            // 销毁当前的子弹对象
            Destroy (gameObject);
        }
        // 如果碰撞到非玩家的其他碰撞器
        else if(col.gameObject.tag != "Player")
        {
            // 调用爆炸效果,销毁子弹
            OnExplode();
            Destroy (gameObject);
        }
    }
}

    创建子弹发出的枪口对象和脚本,注意这个枪口是一个Empty GameObject,记录子弹发出的位置。给改游戏对象添加音频和脚本。

using UnityEngine;
using System.Collections;

public class Gun : MonoBehaviour
{
    public Rigidbody2D rocket;                // 子弹 Prefab
    public float speed = 20f;                // 子弹飞行速度


    private PlayerControl playerCtrl;        // 玩家控制脚本
    private Animator anim;                    // 动画管理器


    void Awake()
    {
        // 获取对象根目录(也就是对顶层的对象)的动画管理器和玩家控制脚本
        anim = transform.root.gameObject.GetComponent<Animator>();
        playerCtrl = transform.root.GetComponent<PlayerControl>();
    }


    void Update ()
    {
        // 开火按钮按下
        if(Input.GetButtonDown("Fire1"))
        {
            // 设置动画控制器的Trigger参数Shoot,表示播放射击动画
            anim.SetTrigger("Shoot");
            // 播放音频
            audio.Play();

            // 玩家对象面向右边
            if(playerCtrl.facingRight)
            {
                // 初始化子弹
                Rigidbody2D bulletInstance = Instantiate(rocket, transform.position, Quaternion.Euler(new Vector3(0,0,0))) as Rigidbody2D;
                // velocity直接给物体一个固定的移动速度
                bulletInstance.velocity = new Vector2(speed, 0);
            }
            else
            {
                // 子弹向左边旋转 
                Rigidbody2D bulletInstance = Instantiate(rocket, transform.position, Quaternion.Euler(new Vector3(0,0,180f))) as Rigidbody2D;
                bulletInstance.velocity = new Vector2(-speed, 0);
            }
        }
    }
}

 

posted on 2014-09-25 02:05  linzheng  阅读(10220)  评论(0编辑  收藏  举报

导航