【问题标题】:Unity reticle as a pointerunity reticle 作为指针
【发布时间】:2016-05-22 17:57:22
【问题描述】:

我有一个 3d Unity 游戏,世界空间中的 3d 对象很少。我在相机空间有一个标线。当十字线穿过每个 3d 对象时,我编写了一个指针输入和指针退出事件。移动手机时,标线会移动,但 3d 对象仍留在世界空间中。标线不能用作指针。尽管触摸事件有效,但我无法将标线作为指针。我已经用相机添加了物理射线投射。 我做错了什么?

【问题讨论】:

  • 非常感谢您的大力帮助....我刚刚实施....会尽快通知您...只是我收到警告“如果隐藏继承的相机是,请使用新关键字打算......”但不工作......我只是在尝试......
  • 我接受作为答案....是否可以保存您的 unitypackage 文件...如果您不介意...
  • 非常感谢......不知道......如何感谢帮助陌生人......向你致敬......上帝保佑
  • 当然....会尽我所能
  • 非常感谢。我明白了。

标签: c# unity3d


【解决方案1】:

好的,所以您尝试在非 UI 对象上使用 UI.Selectable 事件 (Selectable.OnPointerEnter)。

假设您在屏幕空间中有标线位置,我强烈建议使用附加到相机对象的脚本中的Physics.Raycast,尽管它可以简单地引用相机实例。我们可以将它与“hitObject”结合使用来触发自定义十字线进入/退出/悬停事件,如下所示:

CameraPointer.cs:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(Camera))]
public class CameraPointer : MonoBehaviour {
    private GameObject hitObject = null;
    private Vector3 reticlePosition = Vector3.zero;
    private Camera camera;

    void Awake() {
        camera = GetComponent<Camera>();
    }

    // Update is called once per frame
    void Update () {
        // TODO: Replace with reticle screen position
        reticlePosition = Input.mousePosition;

        // Raycast variables
        Ray ray = camera.ScreenPointToRay(reticlePosition); 
        RaycastHit hit;

        // Raycast
        if (Physics.Raycast(ray, out hit)) {
            if (hitObject != hit.transform.gameObject) {
                if (hitObject != null) {
                    hitObject.SendMessage("OnReticleExit"); // Trigger "OnReticleExit"
                }
                hitObject = hit.transform.gameObject;
                hitObject.SendMessage("OnReticleEnter"); // Trigger "OnReticleEnter"
            } else {
                hitObject.SendMessage("OnReticleHover"); // Trigger "OnReticleHover"
            }
        } else {
            if (hitObject != null) {
                hitObject.SendMessage("OnReticleExit"); // Trigger "OnReticleExit"
            }
            hitObject = null;
        }
    }
}

MyObject.cs:

using UnityEngine;
using System.Collections;

public class MyObject : MonoBehaviour
{
    // Custom reticle events
    void OnReticleEnter()
    {
        Debug.Log("Entering over " + this.name);
    }
    void OnReticleExit()
    {
        Debug.Log("Exiting over "+this.name);
    }
    void OnReticleHover()
    {
        Debug.Log("Hovering over "+this.name);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多