Я хочу создать движение мяча, как в игре «Холодный снег».Я хочу изогнуть мяч, но он вращается - PullRequest
0 голосов
/ 24 апреля 2018

Я новичок в единстве и многого не знаю. Я смотрел уроки и увидел один, в котором парень создал точную копию знаменитого «Холодного снега». Игра завершена, но движение мяча не похоже на движение в холодном снегу. Мяч начинает вращаться постоянно, когда я нажимаю кнопку мыши. Я хотел знать, как создать такое движение, чтобы шар поворачивался влево и вправо по кривой, но не выходил на орбиту. Я много гуглил, но не смог найти нужный результат. Я был бы очень признателен, если бы кто-нибудь мог указать мне правильное направление. Изображения прилагаются. Холодный снег | Движение моего мяча

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 голосов
/ 26 апреля 2018

Вот как я бы подошел к этому без поворота ... используя ваш код.

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");
}

}
0 голосов
/ 25 апреля 2018

Вам нужно что-то вроде синусоидального движения или любой другой график, который вам нравится.

Примером может быть такой:

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

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

Выше псевдо для моделирования 2D-графика, может бытьадаптированы к вашей ситуации.

Объект всегда движется вправо и поднимается и опускается при совершении синусоидального движения.Поскольку скорость подъема и опускания не фиксирована, следовательно, вы получаете синусоидальное или подобное синусоидальному движение.

В вашем случае, когда объект всегда опускается, он будетсделайте синусоидальное движение влево и вправо.

Ваше движение основано на вращении, поэтому, если вы зададите эту синусоидальную скорость в качестве скорости вращения, вы сможете достичьthis.


Другим подходом может быть lerp или slerp

Lerp позволяет выполнять довольно плавные транзакции между 2 векторами.

Как перемещение из точки A в точку B за X секунд.

Для поворота вам понадобится Quaternion.Lerp На Ответы Unity есть отличный ответ, вы можете проверить, что если у вас нетt раньше.


Надеюсь, это поможет!Ура!

...