欢迎登录

通过UGUI实现3D物体点击事件

:2018-07-15    :264 次   :6608 字   

A.脚本放在被点击事件

1.给主摄像机添加Physics Raycaster脚本;(检测源)

2.添加UGUI EventSystem (UGUI事件系统)

3.被点击物体需要添加触发器

4.写脚本,实现IPointerClickHandler接口,将脚本挂载到被点击物体上;


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
 
public class EventClick : MonoBehaviour, IPointerClickHandler
{
 
 
    public void OnPointerClick(PointerEventData eventData)
    {
        print("点到我啦!!!");
    }
}


5.运行结果,控制台看结果

B.脚本绑定在主摄影机上

在ugui中创建一个canvas 之后会自动创建一个EventSystem,用来处理UI上的时间响应。(可以通过UI>EventSystem创建EventSystem)

首先是射线检测部分,如下类 AddEeventMonoTest.cs, 其中初始化阶段准备了 必要的一些组件,相机的射线检测组件PhysicsRaycaster,以及事件系统的两个组件(EventSystem,StandaloneInputModule),但是事件相关的这俩组件未必需要绑定到Camera上,任意激活对象上都行。

如下具体实现是给一个Cube添加点击事件的逻辑:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

/// <summary>
/// 给指定的BoxCollider添加点击事件
/// </summary>
public class AddEeventMonoTest : MonoBehaviour
{

    public GameObject targetGameObject;

    // Use this for initialization
    void Start()
    {
        targetGameObject = GameObject.Find("Cube");

        //Camera上必须要有 PhysicsRaycaster,EventSystem,StandaloneInputModule 组件
        if (this.gameObject.GetComponent<PhysicsRaycaster>() == null)
        {
            gameObject.AddComponent<PhysicsRaycaster>();
        }

        if (this.gameObject.GetComponent<EventSystem>() == null)
        {
            this.gameObject.AddComponent<EventSystem>();
        }

        if (this.gameObject.GetComponent<StandaloneInputModule>() == null)
        {
            gameObject.AddComponent<StandaloneInputModule>();
        }
    }

    /// <summary>
    /// 添加组件,BoxCollider,CubeEventItemBind,EventTrigger 和事件函数
    /// </summary>
    /// <param name="itemObject"></param>
    public void AddObjectClickEvent(GameObject itemObject)
    {
        var box = itemObject.GetComponent<BoxCollider>();
        if (box == null)
        {
            box = itemObject.AddComponent<BoxCollider>();
        }

        var item = itemObject.GetComponent<CubeEventItemBind>();
        if (item == null)
            item = itemObject.AddComponent<CubeEventItemBind>();
        item.paramStr = "哈哈";

        EventTrigger trigger = itemObject.GetComponent<EventTrigger>();
        if (trigger == null)
            trigger = itemObject.AddComponent<EventTrigger>();

        EventTrigger.Entry entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.PointerClick;
        UnityEngine.Events.UnityAction<BaseEventData> click = new UnityEngine.Events.UnityAction<BaseEventData>(item.OnClickCubeItem);
        entry.callback.AddListener(click);

        trigger.triggers.Clear();
        trigger.triggers.Add(entry);
    }

    private void OnGUI()
    {
        if (GUILayout.Button("给 GameObject=" + targetGameObject + ",添加点击事件!!"))
        {
            Debug.Log("给 " + targetGameObject + ",添加事件");
            AddObjectClickEvent(targetGameObject);
        }
    }
}
#然后,Cube上负责接收事件的脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// function:具体  cube上 的点击响应事件
/// </summary>
public class CubeEventItemBind : MonoBehaviour {

    public string paramStr = "";

    public void OnClickCubeItem(UnityEngine.EventSystems.BaseEventData data = null)
    {
        Debug.Log("点击了cube tran=" + transform.name + ",paramStr=" + paramStr);
    }
}

C.系统自带的组件实现窗口的弹出

将对象拖到ON Click控制窗口的显示

添加我们的点击事件,这里我们用Unity自带的就可以实现这个功能,首先点击b1按钮,要隐藏掉窗体(Image),

点击OnClick右下角的+号,添加一个

点击圆圈中选择我们的窗体(Image),接的最后吧复选框中的对号打上,不然没有点击效果,同样把窗体上的b2也加进来,然后 选择后面的GameObject->SetActive(bool)

    暂无评论,快来抢沙发吧!
×