Unity3d 我想创建像';寒冷的雪';游戏我想让球弯曲,但它会旋转

Unity3d 我想创建像';寒冷的雪';游戏我想让球弯曲,但它会旋转,unity3d,game-physics,Unity3d,Game Physics,我对unity还不熟悉,知道的东西不多。我一直在看教程,在其中我看到一个家伙创造了著名的“寒冷的雪”的复制品。比赛结束了,但球的运动不像在寒冷的雪地里那样。当我按下鼠标按钮时,球开始不断地旋转。我想知道如何创造这种运动,使球在曲线中左右转动,但不进入轨道。我在谷歌上搜索了很多,但没有找到我想要的结果。如果有人能为我指出正确的方向,我将不胜感激。附图片 公共阶级运动:单一行为{ 私人浮动点; 公众花车运动员速度; 私人浮动旋转速度; 公共文本分数; 私人布尔·伊斯莫文格夫特; 公共游戏对象玩家;

我对unity还不熟悉,知道的东西不多。我一直在看教程,在其中我看到一个家伙创造了著名的“寒冷的雪”的复制品。比赛结束了,但球的运动不像在寒冷的雪地里那样。当我按下鼠标按钮时,球开始不断地旋转。我想知道如何创造这种运动,使球在曲线中左右转动,但不进入轨道。我在谷歌上搜索了很多,但没有找到我想要的结果。如果有人能为我指出正确的方向,我将不胜感激。附图片

公共阶级运动:单一行为{
私人浮动点;
公众花车运动员速度;
私人浮动旋转速度;
公共文本分数;
私人布尔·伊斯莫文格夫特;
公共游戏对象玩家;
公共场所被破坏;
无效开始(){
Time.timeScale=0;
isDead=false;
isMovingLeft=真;
分值=0;
}
无效更新()
{
if(isDead==false)
{
点+=时间增量时间;
}
transform.Translate(Vector3.down*playerSpeed*Time.deltaTime);
if(Input.GetMouseButtonDown(0))
{
Time.timeScale=1;
isMovingLeft=!isMovingLeft;
旋转速度+=0.5f*时间增量;
}
if(Input.GetMouseButton(0))
{
旋转速度=1f;
}
如果(isMovingLeft){
旋转速度+=1.5f*时间增量;
旋转(0,0,旋转速度);
}否则
旋转(0,0,-旋转速度);
}
无效OnTiggerEnter2D(碰撞的R2D其他)
{
如果(other.tag==“障碍物”){
模具();
}
}
公共空间()
{
玩家速度=0f;
isDead=true;
调用(“重启”,2f);
}
void Restart(){
SceneManager.LoadScene(“滑雪场景1”);
}
void FixedUpdate()
{
score.GetComponent().text=points.ToString(“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允许您在2个向量之间进行平滑的事务处理

比如在X秒内从A点移动到B点

对于旋转,你需要
四元数.Lerp
有一个很好的答案,如果你以前没有,你可以检查一下



希望这有帮助!干杯

下面是我在不做旋转的情况下如何接近它。。。使用你的代码

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

}
公共阶级运动:单一行为{
私人浮动点;
公共文本分数;
公共游戏对象玩家;
公共场所被破坏;
私人浮动速度;
私人浮动目标速度;
公共浮动最大速度;
公共交通改变;
无效开始(){
Time.timeScale=0;
isDead=false;
isMovingLeft=真;
分值=0;
targetSpeed=maxXSpeed;
}
无效更新()
{
if(isDead==false)
{
点+=时间增量时间;
}
if(Input.GetMouseButtonDown(0))
{
Time.timeScale=1;
targetSpeed=-targetSpeed;
}
currentSpeed=数学移动方向(currentSpeed、targetSpeed、speedChange*Time.deltaTime);
矢量3移动方向=新矢量3(当前速度,矢量3.down.y*播放器速度,0.0f);
transform.Translate(movementDirection*Time.deltaTime);
}
无效OnTiggerEnter2D(碰撞的R2D其他)
{
如果(other.tag==“障碍物”){
模具();
}
}
公共空间()
{
玩家速度=0f;
isDead=true;
调用(“重启”,2f);
}
void Restart(){
SceneManager.LoadScene(“滑雪场景1”);
}
void FixedUpdate()
{
score.GetComponent().text=points.ToString(“0”);
}
}

了解您当前的操作方法会有所帮助,请展示一些代码,以便我们可以看到您的尝试。@Eddge我已经添加了代码,如果您能帮助我,我将不胜感激。您需要旋转对象吗?或者这是一个偏好的问题?在下面的评论中,你说你想让球向左和向右旋转,我想你的意思是,它在那场比赛中是怎样的?有曲线吗?非常感谢。两种方法都试过,但都不管用。球已经停止向上移动,但左右移动仍然不平稳。正弦函数完成了这项工作,但球会自动向左和向右移动,我希望在鼠标单击时球会向左和向右移动。搜索还在继续…我被困在这里好几天了,终于成功了。谢谢
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");
}

}