射球(重力)

时间:2015-06-09 10:07:54

标签: c# unity3d

我目前在击球和增加速度方面遇到了麻烦。我们的想法是,按住“SPACE”的时间越长,球的行进时间越长。

image

到目前为止,我对玩家控制的内容是:

public class PlayerControl : MonoBehaviour {

    public float speed = 0f;
    Vector3 enVector = new Vector3(10,0,0);
    public bool laserDirection = false;

    public Transform firePoint;
    public GameObject RedBall;

    public PlayerControl player;

    // Use this for initialization
    void Start () { }

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

        // Press CTRL to move the platform under the ball and shoot a laser (NOT FINISHED)
        if (Input.GetKey (KeyCode.LeftControl) && laserDirection == false) 
        {
            transform.Translate(enVector * -speed * Time.deltaTime);
        } 
        else if(Input.GetKey (KeyCode.LeftControl) && laserDirection == true) 
        {

            transform.Translate(enVector * speed * Time.deltaTime);
        }

        // Sets the direction the platform will travel if pressed
        if(Input.GetKey (KeyCode.LeftArrow))
        {
            laserDirection = false;
        }

        // Sets the direction the platform will travel if pressed
        if(Input.GetKey (KeyCode.RightArrow))
        {
            laserDirection = true;
        }

        // Shoots a ball the longer you hold down
        if(Input.GetKey (KeyCode.Space))
        {
            GetComponent<Rigidbody2D> ().velocity = new Vector2 (speed, GetComponent<Rigidbody2D> ().velocity.y);
            Instantiate(RedBall, firePoint.position, firePoint.rotation);
        }
    }

    // Destroy the ball
    void OnTriggerEnter2D(Collider2D other) 
    {
        Destroy (gameObject);
    }
}

如果您看到获取空间按钮的位置,您会看到我为拍摄制作的代码。这只会使球以我选择的设定速度向右移动。

这是为了改变球的方向(围绕大黑球移动):

// THE DIRECTION OF THE BALL SCRIPT
public class RedBall : MonoBehaviour 
{

    public Transform target;

    void Update() 
    {
        // Moves the ball launcher  to the left
        if (Input.GetKey (KeyCode.LeftArrow)) 
        {
            transform.RotateAround (target.position, transform.forward, Time.deltaTime * 90f);
        }

        // Moves the ball launcher  to the right
        if (Input.GetKey (KeyCode.RightArrow)) 
        {
            transform.RotateAround (target.position, -transform.forward, Time.deltaTime * 90f);
        }
    }
}

我正在努力弄清楚如何让球射向所面对的方向,这取决于它在球形脚本中的翻译方式。此外,如何让球在击球时对重力做出反应,以及如何在持续时间越长的情况下进行射门,握住“SPACE”按钮。

如果有人知道如何做至少其中一件事,那将会有很大帮助!谢谢。

2 个答案:

答案 0 :(得分:1)

(而不是使用Rigidbody2D.velocity尝试使用Rigidbody2D.AddForce。要打开和关闭重力,请使用Rigidbody2D-gravityScale

我不太清楚你的意思是“我持有”SPACE按钮的时间越长。你想把它变成“弹簧”并在释放太空按钮时释放它吗?

编辑: 也许这样做。按下按钮时使初始力成为变量并“加载”,当释放时,实例化球并向其添加力。

我把它从脑袋中打出来,没有测试,所以也许它不会开箱即用,但方向应该是明确的

        if (Input.GetKey(KeyCode.Space))
        {
            initialForce += 0.1f;
            GetComponent<Rigidbody2D>().velocity = new Vector2(speed, GetComponent<Rigidbody2D>().velocity.y);
            Instantiate(RedBall, firePoint.position, firePoint.rotation);


        }
        else
        {
            if (initialForce > 0)
            {
                var ball = (GameObject)Instantiate(RedBall, firePoint.position, firePoint.rotation);
                ball.GetComponent<Rigidbody2D>.AddForce(firePoint.rotation * Vector2.one * initialForce);

            }
            initialForce = 0f;
        }

答案 1 :(得分:-1)

  

所以我正在努力弄清楚如何让球射门   它面向的方向取决于它的翻译方式   在球的脚本。

按照您想拍摄的方向乘以速度:

// Shoots a ball the longer you hold down
    if(Input.GetKey (KeyCode.Space)) {

        GetComponent<Rigidbody2D> ().AddForce(transform.forward * speed);
        Instantiate(RedBall, firePoint.position, firePoint.rotation);
    }

另外看看对象池,你真的不应该实例化射弹,它需要很多内存来实例化并在执行过程中一直销毁。

  

如何在击球时使球具有重力

protected float gravity = 1f;
protected bool isShot = false;

// Update is called once per frame
void Update ()
{
    if(isShot)
        rigidBody.velocity.z += gravity * Time.deltaTime;
}
  

按住“SPACE”按钮的时间越长,拍摄时间越长。

public float rate = 1.0f;
protected float power = 0f;

// Update is called once per frame
void Update ()
{
    if (Input.GetKeyUp (KeyCode.Space))
    {
        UsePower(power);
        power = 0f;
    }
    if (Input.GetKey (KeyCode.Space))
    {
        power += rate * Time.deltaTime;
    }
}

void UsePower (float _power)
{
    // Use power here
}