我需要使场景中的某个项目可单击,但仅当玩家靠近该项目时才可以。在我的脚本中,我使有问题的项目自动进入一个空的GameObject,该对象是层次结构中Player的子级,以定义位置,但是只要摄像机将其框起来即可单击。我使用的是2D物理学中提供的角色控制器,而不是2drigidbody,因此我更加困惑,因为我无法使用对撞机。
答案 0 :(得分:1)
我很确定您可以在游戏对象上同时拥有角色控制器和对撞机(至少是触发器对撞机)。
然后,而不是使用任何检测点击的方法,应该在Update循环中使用诸如Input.GetKeyDown(KeyCode.Mouse0)
之类的方法,并使用光线投射来指定光线的长度。 https://docs.unity3d.com/ScriptReference/Physics.Raycast.html
答案 1 :(得分:0)
为了使任何内容都可点击,我建议使用IPointerXHandler
界面(用Click
,Enter
,Exit
,Down
,{{1}替换X }等。
注意:
确保场景中存在
Up
,以允许单击检测。要在非UI 游戏对象上进行点击检测,请确保将PhysicsRaycaster
连接到相机。
如果您只想单击EventSystem
就足够了。如果您需要一些视觉反馈,例如更改颜色等,则必须至少使用IPointerClickHandler
和IPointerEnterHandler
进行扩展。
IPointerExitHandler
然后,为了获取两个对象之间的距离,您可以简单地使用Vector3.Distance
,例如具有一定的角蛋白阈值
public class MyClickable : MonoBehaviour, IPointerClickHandler
{
public void OnPointerClick(PointerEventData pointerEventData)
{
...
}
}
,然后使用类似的
// configure those e.g. in the Inspector
public float distanceThreshold;
public Transofrm playerTransform;
public Transform itemTransform;
因此,如果您直接在if(Vector3.Distance(playerTransform.position, itemTransform.position) <= distanceThreshold)
{
...
}
中实现此功能,则也可以在MyClickable
中进行视觉反馈,例如
Update
答案 2 :(得分:0)
我的建议是使用onMouseDown()方法。如果您的游戏对象上附加了对撞机或触发器,则onMouseDown()将检测鼠标对对象的单击。然后在onMouseDown()的主体中,可以测试它是否在范围内。
这是一个示例脚本,其工作方式:
public class ItemClickable : MonoBehaviour
{
public Transform player; // player-transform reference (depends if you have a singleton or not)
public float range; // radius (maybe you have a range or radius already set in your player instance)
void Start()
{
// Setup for your references
}
private void OnMouseDown()
{
// Checks if the item is in the range of the player
if ((player.position-gameObject.transform.position).magnitude < range) // Vector3.Distance() is also possible
{
Destroy(gameObject); // or do whatever you want in here
}
}
}