使用 2D Raycast 检测鼠标悬停在对象碰撞器上的问题
Issues using a 2D Raycast to detect mouse hover on object colliders
我目前正在 Unity 中处理 2D 角色选择屏幕,该屏幕的操作应该与真人快打角色选择屏幕类似。目前,我有一个名为 CharacterSelector
的 class 连接到主摄像头。 class 包含 selection/deselection 字符、悬停事件和选择确认的方法。我能够使用 RayCast2D
来构建我的角色选择方法;但是,我 运行 遇到将其用于悬停事件的问题。
在我的场景中,我有一组角色图像供玩家选择(如果已解锁)。当玩家用 his/her 鼠标悬停在角色上时,角色图像应该被黄色边框包围。当用户点击想要的角色时,该角色图像组的左侧会弹出该图像的放大版本。
现在,我有以下悬停方法代码:
public void onHover(Ray ray, RaycastHit2D hit)
{
if(hit.collider == null)
{
Debug.Log("nothing hit");
}
if (Physics2D.Raycast(ray.origin, ray.direction, Mathf.Infinity))
{
print(hit.collider.name);
}
}
此方法属于 class,CharacterSelection
class 继承自该方法。以下是CharacterSelection
class:
class CharacterSelector : Selector
{
Ray ray;
RaycastHit2D hit;
public void Start()
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
}
void Update()
{
onHover(ray, hit);
if (Input.GetMouseButtonDown(0))
{
selectCharacter();
}
}
}
另外,我试图悬停的所有角色图像目前都有 2D Box Colliders。截至目前,我无法进行悬停操作。它不会将字符图像的名称打印到控制台。我用这个作为第一步来查看 Unity 是否识别角色图像。如果我可以提供更多信息,请告诉我!
鼠标几乎每一帧都在屏幕上改变位置。这意味着你的光线应该根据鼠标位置每帧更新。所以我将相应的语句从 Start() 移动到 Update();
class CharacterSelector : Selector
{
Ray ray;
RaycastHit2D hit;
public void Start()
{
}
void Update()
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
onHover(ray, hit);
if (Input.GetMouseButtonDown(0))
{
selectCharacter();
}
}
}
其次,如果您查看 the definition of Physics2D.Raycast,您会发现它返回了 RaycastHit2D 对象。这是您应该检查其碰撞器的对象,而不是您应该抛出 NullReferenceException 的命中对象,我不知道为什么没有。所以这个:
public void onHover(Ray ray, RaycastHit2D hit)
{
hit = Physics2D.Raycast(ray.origin, ray.direction, Mathf.Infinity);
if(hit.collider == null)
{
Debug.Log("nothing hit");
}
else
{
print(hit.collider.name);
}
}
除此之外,您实际上不需要 onHover() 函数中的 hit 参数,它可以是函数中的局部变量。但是,如果您计划在 CharacterSelector 脚本中使用您的 hit 变量,那么您应该将 onHover 的声明更改为: onHover(Ray ray, out RaycastHit2D hit)
out
关键字通过引用而不是其值的副本传递变量。
此外,我认为检查鼠标是否悬停在对象上不应该在 onHover 中完成,这有点误导而且对我来说似乎不合逻辑。我会将 onHover 的主体移动到另一个函数,如 RaycastChecker()。只有当鼠标实际上悬停在精灵上时,我才会调用 onHover() 。 (就像在 OnCollisionEnter 中一样,你认为碰撞确实发生了,我认为 onHover 也应该如此)
我目前正在 Unity 中处理 2D 角色选择屏幕,该屏幕的操作应该与真人快打角色选择屏幕类似。目前,我有一个名为 CharacterSelector
的 class 连接到主摄像头。 class 包含 selection/deselection 字符、悬停事件和选择确认的方法。我能够使用 RayCast2D
来构建我的角色选择方法;但是,我 运行 遇到将其用于悬停事件的问题。
在我的场景中,我有一组角色图像供玩家选择(如果已解锁)。当玩家用 his/her 鼠标悬停在角色上时,角色图像应该被黄色边框包围。当用户点击想要的角色时,该角色图像组的左侧会弹出该图像的放大版本。
现在,我有以下悬停方法代码:
public void onHover(Ray ray, RaycastHit2D hit)
{
if(hit.collider == null)
{
Debug.Log("nothing hit");
}
if (Physics2D.Raycast(ray.origin, ray.direction, Mathf.Infinity))
{
print(hit.collider.name);
}
}
此方法属于 class,CharacterSelection
class 继承自该方法。以下是CharacterSelection
class:
class CharacterSelector : Selector
{
Ray ray;
RaycastHit2D hit;
public void Start()
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
}
void Update()
{
onHover(ray, hit);
if (Input.GetMouseButtonDown(0))
{
selectCharacter();
}
}
}
另外,我试图悬停的所有角色图像目前都有 2D Box Colliders。截至目前,我无法进行悬停操作。它不会将字符图像的名称打印到控制台。我用这个作为第一步来查看 Unity 是否识别角色图像。如果我可以提供更多信息,请告诉我!
鼠标几乎每一帧都在屏幕上改变位置。这意味着你的光线应该根据鼠标位置每帧更新。所以我将相应的语句从 Start() 移动到 Update();
class CharacterSelector : Selector
{
Ray ray;
RaycastHit2D hit;
public void Start()
{
}
void Update()
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
onHover(ray, hit);
if (Input.GetMouseButtonDown(0))
{
selectCharacter();
}
}
}
其次,如果您查看 the definition of Physics2D.Raycast,您会发现它返回了 RaycastHit2D 对象。这是您应该检查其碰撞器的对象,而不是您应该抛出 NullReferenceException 的命中对象,我不知道为什么没有。所以这个:
public void onHover(Ray ray, RaycastHit2D hit)
{
hit = Physics2D.Raycast(ray.origin, ray.direction, Mathf.Infinity);
if(hit.collider == null)
{
Debug.Log("nothing hit");
}
else
{
print(hit.collider.name);
}
}
除此之外,您实际上不需要 onHover() 函数中的 hit 参数,它可以是函数中的局部变量。但是,如果您计划在 CharacterSelector 脚本中使用您的 hit 变量,那么您应该将 onHover 的声明更改为: onHover(Ray ray, out RaycastHit2D hit)
out
关键字通过引用而不是其值的副本传递变量。
此外,我认为检查鼠标是否悬停在对象上不应该在 onHover 中完成,这有点误导而且对我来说似乎不合逻辑。我会将 onHover 的主体移动到另一个函数,如 RaycastChecker()。只有当鼠标实际上悬停在精灵上时,我才会调用 onHover() 。 (就像在 OnCollisionEnter 中一样,你认为碰撞确实发生了,我认为 onHover 也应该如此)