如何使Bullet从玩家所处的方向开始

时间:2015-04-05 03:51:14

标签: c# unity3d 2d

我在Unity制作2D游戏。

在这里,我想添加一个射击数量有限的子弹。

子弹朝玩家方向射击,但即使玩家面向左侧,也始终从右侧开始。我把子弹数量限制在3个。

如何在子弹出现之间设置延迟?

第一个剧本(子弹)

public class Bullet : MonoBehaviour {

    private Player player;
    public float speed = 1f;
    public int abc = 2;

    // Use this for initialization
    void Start () {
        player = GameObject.Find ("Player").GetComponent<Player> ();
        if (player.aa.x == transform.localScale.x)
            abc = 1;
    }

    // Update is called once per frame
    public void Update () {
        if (abc == 1)
            rigidbody2D.velocity = new Vector3 (transform.localScale.x, 0, 1) * speed;
        else
            rigidbody2D.velocity = new Vector3 (transform.localScale.x, 0, 1) * speed;
    }
}

第二个剧本(播放器)

public class Player : MonoBehaviour {

    public float speed = 10f;
    public Vector2 maxVelocity = new Vector2(3, 5);
    public bool standing;
    public float jetSpeed = 15f;
    public float airSpeedMultiplier = .3f;
    public AudioClip leftFootSound;
    public AudioClip rightFootSound;
    public AudioClip thudSound;
    public AudioClip rocketSound;
    public Vector3 aa = new Vector3(1,1,1);

    private Animator animator;
    private PlayerController controller;

    void Start(){
        controller = GetComponent<PlayerController> ();
        animator = GetComponent<Animator> ();
    }

    void PlayLeftFootSound(){
        if (leftFootSound)
            AudioSource.PlayClipAtPoint (leftFootSound, transform.position);
    }

    void PlayRightFootSound(){
        if (rightFootSound)
            AudioSource.PlayClipAtPoint (rightFootSound, transform.position);
    }

    void PlayRocketSound(){
        if (!rocketSound || GameObject.Find ("RocketSound"))
            return;

        GameObject go = new GameObject ("RocketSound");
        AudioSource aSrc = go.AddComponent<AudioSource> ();
        aSrc.clip = rocketSound;
        aSrc.volume = 0.7f;
        aSrc.Play ();

        Destroy (go, rocketSound.length);
    }

    void OnCollisionEnter2D(Collision2D target){
        if (!standing) {
            var absVelX = Mathf.Abs(rigidbody2D.velocity.x);
            var absVelY = Mathf.Abs(rigidbody2D.velocity.y);

            if(absVelX <= .1f || absVelY <= .1f){
                if(thudSound)
                    AudioSource.PlayClipAtPoint(thudSound, transform.position);
            }
        }
    }

    // Update is called once per frame
    void Update () {
        var forceX = 0f;
        var forceY = 0f;

        var absVelX = Mathf.Abs (rigidbody2D.velocity.x);
        var absVelY = Mathf.Abs (rigidbody2D.velocity.y);

        if (absVelY < .2f)
            standing = true;
        else
            standing = false;

        if (controller.moving.x != 0) {
            if (absVelX < maxVelocity.x) {

                forceX = standing ? speed * controller.moving.x : (speed * controller.moving.x * airSpeedMultiplier);

                aa = transform.localScale = new Vector3 (forceX > 0 ? 1 : -1, 1, 1);

            }

            animator.SetInteger ("AnimState", 1);

        } else {
            animator.SetInteger ("AnimState", 0);
        }

        if (controller.moving.y > 0) {
            PlayRocketSound();
                        if (absVelY < maxVelocity.y)
                                forceY = jetSpeed * controller.moving.y;

                        animator.SetInteger ("AnimState", 2);
                } else if (absVelY > 0) {
            animator.SetInteger("AnimState", 3);
                }

        rigidbody2D.AddForce (new Vector2 (forceX, forceY));
    }
}

第三个脚本(PlayerController)

public class PlayerController : MonoBehaviour {

    public Vector2 moving = new Vector2();
    public int Bulletlimit = 0;
    public int MaxBulletlimit = 3;
    public float bulletDelay = 3f;
    public bool Gun;

    public Bullet bullet;
    // Use this for initialization
    void Start () {}

    // Update is called once per frame
    void Update () {

        moving.x = moving.y = 0;

        if (Input.GetKey ("right")) {
            moving.x = 1;
        } else if (Input.GetKey ("left")) {
            moving.x = -1;
        }

        if (Input.GetKey ("up")) {
            moving.y = 1;
        } else if (Input.GetKey ("down")) {
            moving.y = -1;
        }

        if (Input.GetKey ("s")) {
            if(Gun){
                if(Bulletlimit < MaxBulletlimit)
                {
                    Bullet clone = Instantiate (bullet, transform.position, Quaternion.identity) as Bullet;
                    Bulletlimit = Bulletlimit + 1;
                }
            }
        }   
    }

    public void BulletCount() {
        Bulletlimit = Bulletlimit - 1;
    }
}

1 个答案:

答案 0 :(得分:0)

1)有一种简单的方法可以知道子弹的位置和射击方向。在你的角色下添加一个儿童虚拟游戏对象,用作子弹的初始位置。将它放在你想要的位置。现在这个游戏对象相对于你的角色移动和旋转。实例化项目符号时,请使用它transform.positiontransform.rotation.forward

2)当用户在private float lastShotTime;之类的变量中发射子弹时保持当前时间。发射子弹lastShotTime = Time.time时更新它的值。然后,当用户想要射击另一颗子弹时,检查自上一次射击if (Time.time > lastShotTime + fireDelay) { Shoot(); }以来是否已经过了足够的时间。