我有一个球站在一个平台上,我已经编写了代码,以便每次我向上滑动球,从一个平台跳到另一个平台,这取决于滑动的力量。目前我的平台只是由我自己放置,我没有随机生成的脚本。我唯一的脚本是播放器上的滑动和向前移动。
目前我通过在两个方向上加力来进行此动作,向上和向前以创建弹丸运动。它的工作方式也是如此,但动作太慢了。我希望它能更快地移动。我试过用力量和球的质量来玩。他们确实有所作为,但我仍然希望球能以更快的速度移动。
添加力量是最好的方法吗?或者你会推荐一种不同的方式吗?
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;
}
}
}
答案 0 :(得分:1)
当我注意到@Fredrik的评论时,我正在写我的答案:几乎所有他说的都是我写的,所以我只是跳过它! (我也不建议增加Time.timeScale
)
你可以移动球的另一种方法是使用弹道方程并将 RigidBody 设置为运动学。通过这种方式,您可以使用RigidBody.MovePosition()
通过代码控制球速,并且仍会获得OnCollision[...]
个事件。
另外作为旁注,我不建议使用collision.gameObject.name
进行碰撞对象检查,而是标记您的多维数据集,甚至将其图层设置为特定的(但我想这可能是您的临时代码;))
希望这有帮助,
答案 1 :(得分:0)
将ForceMode.VelocityChange作为第二个参数传递给AddForce,或者确保将矢量除以Time.fixedDeltaTime(由于Time.fixedDeltaTime将小于1,因此具有倍增效果)。