unity如何使用add force滑动跳跃动作。

时间:2017-01-17 08:11:59

标签: unity3d touch swipe

我有一个球站在一个平台上,我已经编写了代码,以便每次我向上滑动球,从一个平台跳到另一个平台,这取决于滑动的力量。目前我的平台只是由我自己放置,我没有随机生成的脚本。我唯一的脚本是播放器上的滑动和向前移动。

目前我通过在两个方向上加力来进行此动作,向上和向前以创建弹丸运动。它的工作方式也是如此,但动作太慢了。我希望它能更快地移动。我试过用力量和球的质量来玩。他们确实有所作为,但我仍然希望球能以更快的速度移动。

添加力量是最好的方法吗?或者你会推荐一种不同的方式吗?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SwipeScript : MonoBehaviour {
public float maxTime;
public float minSwipeDist;

float startTime;
float endTime;

Vector3 startPos;
Vector3 endPos;
float swipeDistance;
float swipeTime;

// Use this for initialization
void Start()
{

}

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

    if (Input.touchCount > 0)
    {
        Touch touch = Input.GetTouch(0);

        if (touch.phase == TouchPhase.Began)
        {
            startTime = Time.time;
            startPos = touch.position;
        }
        else if (touch.phase == TouchPhase.Ended)
        {
            endTime = Time.time;
            endPos = touch.position;

            swipeDistance = (endPos - startPos).magnitude;
            swipeTime = endTime - startTime;

            if (swipeTime < maxTime && swipeDistance > minSwipeDist)
            {
                swipe();
            }
        }
    }
}

public void swipe()
{
    Vector2 distance = endPos - startPos;

    if (Mathf.Abs(distance.y) > Mathf.Abs(distance.x))
    {
        Debug.Log("Swipe up detected");
        jump();
    }

}
private void jump()
{
    Vector2 distance = endPos - startPos;
    GetComponent<Rigidbody>().AddForce(new Vector3(0, Mathf.Abs(distance.y/5), Mathf.Abs(distance.y/5)));
}

private void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.name == "Cube (1)") {
        Debug.Log("collision!");
        GetComponent<Rigidbody>().velocity = Vector3.zero;
        GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
    }
}

}

why is the ball shadow so pixelated by the way?

2 个答案:

答案 0 :(得分:1)

当我注意到@Fredrik的评论时,我正在写我的答案:几乎所有他说的都是我写的,所以我只是跳过它! (我也不建议增加Time.timeScale

你可以移动球的另一种方法是使用弹道方程并将 RigidBody 设置为运动学。通过这种方式,您可以使用RigidBody.MovePosition()通过代码控制球速,并且仍会获得OnCollision[...]个事件。

另外作为旁注,我不建议使用collision.gameObject.name进行碰撞对象检查,而是标记您的多维数据集,甚至将其图层设置为特定的(但我想这可能是您的临时代码;))

希望这有帮助,

答案 1 :(得分:0)

将ForceMode.VelocityChange作为第二个参数传递给AddForce,或者确保将矢量除以Time.fixedDeltaTime(由于Time.fixedDeltaTime将小于1,因此具有倍增效果)。