我正在开发一个"踢场地"为了教自己Unity 3d的类型游戏。我有我想要的界面和功能,这样游戏就像这样:
我在OnUpdate中使用一些代码来检测鼠标按钮何时被按下(或触摸阶段开始)以及何时释放(或触摸阶段结束)并计算滑动方向,距离和持续时间。我想把这些信息翻译成一个初始速度到#34;启动"足球,但似乎数学稍微超出了我。
我从这样的事情开始:
rigidbody.velocity = new Vector3(
Mathf.Min(15, swipeDelta.x * .13f),
Mathf.Min(20, swipeDelta.y * yRatio),
5 / swipeDuration);
这当然在我的初始分辨率和宽高比方面效果很好,但是一改变其中任何一个就失败了。我希望代码能够获得更高的分辨率和宽高比,或者至少是相对的。上面代码中使用的数字是完全随意的,并且被发现在我基于迭代测试的初始分辨率下产生期望的结果。
有什么建议吗?
答案 0 :(得分:2)
我们的想法是获取起点和终点之间的距离和持续时间,并将它们用于速度。
我使用ScreenToWorldPoint来获取从屏幕坐标到世界坐标的鼠标位置,以便计算世界中的距离,而不是屏幕的像素密度或分辨率。
预期的最小/最大值是在进行任何调整之前获得的功率值。要获得良好的值,您可以进行慢/短滑动以及最快的快速扫描。
所需的最小值/最大值是您的任意值,可以产生理想的结果。
您可能需要根据游戏的方向旋转速度。现在向上滑动给出正y值,向右滑动给出正x值。
Vector3 startPos;
float startTime;
void Update ()
{
if (Input.GetMouseButtonDown(0))
{
//Store initial values
startPos = Input.mousePosition;
startTime = Time.time;
}
if (Input.GetMouseButtonUp(0))
{
//Get end values
Vector3 endPos = Input.mousePosition;
float endTime = Time.time;
//Mouse positions distance from camera. Might be a better idea to use the cameras near plane
startPos.z = 0.1f
endPos.z = 0.1f
//Makes the input pixel density independent
startPos = Camera.main.ScreenToWorldPoint(startPos);
endPos = Camera.main.ScreenToWorldPoint(endPos);
//The duration of the swipe
float duration = endTime - startTime;
//The direction of the swipe
Vector3 dir = endPos - startPos;
//The distance of the swipe
float distance = dir.magnitude;
//Faster or longer swipes give higher power
float power = distance / duration;
//expected values are what power you get when you try
//desired values are what you want
//you might want these as public values so they can be set from the inspector
const float expectedMin = 50;
const float expectedMax = 60;
const float desiredMin = 15;
const float desiredMax = 20;
//Measure expected power here
Debug.Log(power);
//change power from the range 50...60 to 0...1
power -= expectedMin;
power /= expectedMax - expectedMin;
//clamp value to between 0 and 1
power = Mathf.Clamp01(power);
//change power to the range 15...20
power *= desiredMax - desiredMin;
power += desiredMin;
//take the direction from the swipe. length of the vector is the power
Vector3 velocity = (transform.rotation * dir).normalized * power
}