我想创造像“寒冷的雪”中那样的球运动。游戏。我想弯曲球,但它会旋转

时间:2018-04-24 14:35:42

标签: unity3d game-physics

我是团结的新手,并且不了解很多东西。我一直在看教程,我看到其中一个人制作了着名的“Chilly Snow'”的复制品。游戏已经完成但是球的运动并不像寒冷的雪中那样。当我按下鼠标按钮时,球开始连续旋转。我想知道如何创造这种运动,以便球在曲线中左右转动,但不会进入轨道。我google了很多但是找不到我要求的结果。如果有人能指出我正确的方向,我真的很感激。图片已附上。Chilly Snow | Movement of my ball

public class movement : MonoBehaviour {

private float points;
public float playerSpeed;
private float rotationSpeed;
public Text score;
private bool isMovingLeft;
public GameObject player;
public bool isDead;




void Start () {

    Time.timeScale = 0;
    isDead = false;
    isMovingLeft = true;
    points = 0;



}


void Update () 
{
    if (isDead == false) 
    {
        points += Time.deltaTime;
    }

    transform.Translate (Vector3.down * playerSpeed * Time.deltaTime);

    if (Input.GetMouseButtonDown (0)) 
    {
        Time.timeScale = 1;
        isMovingLeft = !isMovingLeft;
        rotationSpeed += 0.5f * Time.deltaTime;

    }

    if (Input.GetMouseButton (0)) 
    {
        rotationSpeed = 1f;
    }

    if (isMovingLeft) {
        rotationSpeed += 1.5f * Time.deltaTime;
        transform.Rotate(0,0,rotationSpeed);

    } else
        transform.Rotate(0,0, - rotationSpeed);
}


void OnTriggerEnter2D(Collider2D other)
{
    if (other.tag == "Obstacle") {
        Die ();
    }
}

public void Die()
{


    playerSpeed = 0f;
    isDead = true;
    Invoke ("Restart", 2f);

}

void Restart(){

    SceneManager.LoadScene ("Ski_scene_1");

}

void FixedUpdate()
{
    score.GetComponent<Text>().text = points.ToString("0");
}

}

2 个答案:

答案 0 :(得分:1)

以下是我如何在不轮换的情况下使用您的代码来接近它。

public class movement : MonoBehaviour {

private float points;
public Text score;
public GameObject player;
public bool isDead;

private float currentXSpeed;
private float targetSpeed;
public float maxXSpeed;
public float speedChange;

void Start () {
    Time.timeScale = 0;
    isDead = false;
    isMovingLeft = true;
    points = 0;
    targetSpeed = maxXSpeed;
}


void Update () 
{
    if (isDead == false) 
    {
        points += Time.deltaTime;
    }

    if(Input.GetMouseButtonDown(0))
    {
         Time.timeScale = 1;
         targetSpeed = -targetSpeed;
    }

    currentSpeed = mathf.MoveTowards(currentSpeed, targetSpeed, speedChange * Time.deltaTime);
    Vector3 movementDirection = new Vector3(currentSpeed, Vector3.down.y * playerSpeed, 0.0f);
    transform.Translate (movementDirection * Time.deltaTime);
}

void OnTriggerEnter2D(Collider2D other)
{
    if (other.tag == "Obstacle") {
        Die ();
    }
}

public void Die()
{
    playerSpeed = 0f;
    isDead = true;
    Invoke ("Restart", 2f);
}

void Restart(){
    SceneManager.LoadScene ("Ski_scene_1");
}

void FixedUpdate()
{
    score.GetComponent<Text>().text = points.ToString("0");
}

}

答案 1 :(得分:0)

你需要像正弦运动或你喜欢的任何其他图形。

一个例子就是这样;

gameObject.transform.Translate(Vector3.right * Time.deltaTime*cubeSpeed);

gameObject.transform.position += transform.up * Mathf.Sin (Time.fixedTime * 3.0f  ) * 0.1f;

以上伪是用于2D图形模拟,可以根据您的情况进行调整。

物体始终向右移动并在进行正弦运动时上下移动。因为上下速度不固定,所以你得到正弦就像正弦运动。

在你的情况下,当对象总是向下时,它将使正弦向左和向右移动。

您的移动基于旋转,因此,如果您将此正弦速度作为旋转速度,则可以实现此目的。

另一个方法可以是 lerp slerp

Lerp允许您在两个向量之间进行平滑的交易。

喜欢在X秒内从pointA移动到pointB。

要进行轮换,您需要Quaternion.Lerp Unity Answers上有一个很好的答案,如果您之前没有,可以检查一下。

希望这有帮助!干杯!