我在代码中发现了一个缺陷,我看到只有第一个球的位置受到监视,再次滑动时,我需要从球的起始位置滑动。我该如何修理它,以便在球移动后能从其所在位置刷卡?谢谢!代码在这里:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SwipeUnlimited : MonoBehaviour
{
Rigidbody2D rbody;
Vector2 startpos;
Vector2 endpos;
float power = 5f; // power of shot
// Use this for initialization
void Start()
{
rbody = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonUp(0))
{
endpos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
LaunchBall();
}
}
void OnMouseDown()
{
startpos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
}
void LaunchBall()
{
Vector2 direction = (startpos - endpos); // swap subtraction to switch direction of launch
rbody.AddForce(direction * power, ForceMode2D.Impulse);
}
}
答案 0 :(得分:2)
OnMouseDown
仅在指针位于碰撞体上方时被调用,而GetMouseButtonUp
被全局地从碰撞体中独立调用。这意味着您可能使用错误的坐标来调用LaunchBall()
,因为startpos
可能设置不正确。
只是一个怀疑,但您甚至可能根本没有碰到对撞机和OnMouseDown
,而是从0,0,0
开始,startpos
是startpose
的默认值(如果未设置为其他值)
在您看来,您总是必须从头一个startpose
开始刷卡,但是isLaunching
实际上可能根本不会被更改。
为避免这种情况,我将使用简单的标志Update
。
此外,我不会使用OnMouseDown
,而是使用OnMouseUp
。与OnMouseUp
不同,Update
会被调用,即使鼠标不在对撞机上也是如此,基本上它会执行相同的操作,但是不会重复运行bool isLaunching;
// instead of your Update
void OnMouseUp()
{
// makes sure you can only launch after updating startpos
if(!isLaunching) return;
endpos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
LaunchBall();
isLaunching = false;
}
void OnMouseDown()
{
startpos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
isLaunching = true;
}
方法。
OnMouseDown
如果现在什么也没发生,那么您根本不知道startActivity(new Intent(this, Class.forName(getPackageManager().getApplicationInfo(getPackageName(), 128).metaData.getString("com.sadaf.javafiles.MAIN_ACTIVITY_CLASS_NAME"))));
,您可能会错过对撞机。