C# 统一对象位置
我在我的代码中发现了一个缺陷,我发现只有我的第一个球位置被监控,当我再次刷球时,我需要从球的起始位置刷球。我如何修复它,以便在球移动后可以从球所在的位置滑动?非常感谢。代码如下:C# 统一对象位置,c#,android,visual-studio,unity3d,touch,C#,Android,Visual Studio,Unity3d,Touch,我在我的代码中发现了一个缺陷,我发现只有我的第一个球位置被监控,当我再次刷球时,我需要从球的起始位置刷球。我如何修复它,以便在球移动后可以从球所在的位置滑动?非常感谢。代码如下: using System.Collections; using System.Collections.Generic; using UnityEngine; public class SwipeUnlimited : MonoBehaviour { Rigidbody2D rbody; Vector
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);
}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类SwipeUnlimited:单行为
{
刚体2d-rbody;
Vector2 startpos;
向量2末端位置;
浮动功率=5f;//放炮功率
//用于初始化
void Start()
{
rbody=GetComponent();
}
//每帧调用一次更新
无效更新()
{
if(Input.GetMouseButtonUp(0))
{
endpos=Camera.main.ScreenToWorldPoint(Input.mousePosition);
发射球();
}
}
void OnMouseDown()
{
startpos=Camera.main.ScreenToWorldPoint(Input.mousePosition);
}
无效启动球()
{
Vector2方向=(startpos-endpos);//交换减法以切换启动方向
rbody.AddForce(方向*功率,力模式2D.脉冲);
}
}
仅在指针位于碰撞器上方时调用,而GetMouseButtonUp
被称为全局独立于碰撞器。这意味着您可能使用错误的坐标调用LaunchBall()
,因为startpos
可能设置不正确
只是一个怀疑,但您甚至可能根本没有调用碰撞器和OnMouseDown
,而是从0,0,0
开始,如果未设置为其他值,这是startpos
的默认值
因此,在您看来,您必须始终从第一个startpose
开始刷卡,但是startpose
实际上可能永远不会更改
为了避免这种情况,我将使用一个简单的标志isLaunching
另外,我不会使用Update
,而是使用。与OnMouseDown
不同,即使鼠标不在碰撞器上,也会调用onmousedup
,因此基本上它会执行相同的操作,但不会重复运行Update
方法
bool-isLaunching;
//而不是你的更新
void OnMouseUp()
{
//确保您只能在更新startpos后启动
如果(!isLaunching)返回;
endpos=Camera.main.ScreenToWorldPoint(Input.mousePosition);
发射球();
isLaunching=false;
}
void OnMouseDown()
{
startpos=Camera.main.ScreenToWorldPoint(Input.mousePosition);
isLaunching=true;
}
如果现在什么也没有发生,那么您就知道根本不会调用OnMouseDown
,您可能缺少一个碰撞器。仅当指针位于碰撞器上时才会调用,而GetMouseButtonUp
则从碰撞器全局独立调用。这意味着您可能使用错误的坐标调用LaunchBall()
,因为startpos
可能设置不正确
只是一个怀疑,但您甚至可能根本没有调用碰撞器和OnMouseDown
,而是从0,0,0
开始,如果未设置为其他值,这是startpos
的默认值
因此,在您看来,您必须始终从第一个startpose
开始刷卡,但是startpose
实际上可能永远不会更改
为了避免这种情况,我将使用一个简单的标志isLaunching
另外,我不会使用Update
,而是使用。与OnMouseDown
不同,即使鼠标不在碰撞器上,也会调用onmousedup
,因此基本上它会执行相同的操作,但不会重复运行Update
方法
bool-isLaunching;
//而不是你的更新
void OnMouseUp()
{
//确保您只能在更新startpos后启动
如果(!isLaunching)返回;
endpos=Camera.main.ScreenToWorldPoint(Input.mousePosition);
发射球();
isLaunching=false;
}
void OnMouseDown()
{
startpos=Camera.main.ScreenToWorldPoint(Input.mousePosition);
isLaunching=true;
}
如果现在什么也没有发生,您就会知道,
OnMouseDown
根本没有被调用,您可能缺少一个碰撞器。能否在LaunchBall
方法中设置一个断点,以查看第二次刷卡时startpos
和endpos
的值是多少?当你从另一个位置刷卡时,会发生什么情况?@MartinZikmund我会说,如果他从另一个位置刷卡,那么不会调用OnMouseDown
,因此startpos
不会更新,但仍然是第一个位置的刷卡。由于OnMouseDown
仅在指针位于碰撞器上方时调用,而GetMouseButtonUp
被全局独立于碰撞调用,因此您是否可以在LaunchBall
方法中设置断点,以查看第二次滑动期间startpos
和endpos
的值?当你从另一个位置刷卡时,会发生什么情况?@MartinZikmund我会说,如果他从另一个位置刷卡,那么不会调用OnMouseDown
,因此startpos
不会更新,但仍然是第一个位置的刷卡。因为只有当指针位于碰撞器上方时才会调用OnMouseDown
,而GetMouseButtonUp
被称为全局独立于碰撞器