如何根据玩家的距离使对象可点击?

时间:2019-04-03 07:02:32

标签: c# unity3d

我需要使场景中的某个项目可单击,但仅当玩家靠近该项目时才可以。在我的脚本中,我使有问题的项目自动进入一个空的GameObject,该对象是层次结构中Player的子级,以定义位置,但是只要摄像机将其框起来即可单击。我使用的是2D物理学中提供的角色控制器,而不是2drigidbody,因此我更加困惑,因为我无法使用对撞机。

3 个答案:

答案 0 :(得分:1)

我很确定您可以在游戏对象上同时拥有角色控制器和对撞机(至少是触发器对撞机)。

然后,而不是使用任何检测点击的方法,应该在Update循环中使用诸如Input.GetKeyDown(KeyCode.Mouse0)之类的方法,并使用光线投射来指定光线的长度。 https://docs.unity3d.com/ScriptReference/Physics.Raycast.html

答案 1 :(得分:0)

为了使任何内容都可点击,我建议使用IPointerXHandler界面(用ClickEnterExitDown,{{1}替换X }等。

注意:

  

确保场景中存在Up,以允许单击检测。要在非UI 游戏对象上进行点击检测,请确保将PhysicsRaycaster连接到相机。

如果您只想单击EventSystem就足够了。如果您需要一些视觉反馈,例如更改颜色等,则必须至少使用IPointerClickHandlerIPointerEnterHandler进行扩展。

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
        }
    }
}