什么阻止我的相机移动脚本接收输入事件?

时间:2017-02-17 15:10:07

标签: c# unity3d

感谢阅读。我尝试在统一答案上发布这个,但它已经24小时了,但仍然没有适度,所以也许我会在这里有更好的运气。

背景

我对团结非常陌生,并且知道我必须缺少一些重要的知识来将这种联系起来。我创建了一个带有一些占位符地形的空白游戏,并在3D正交场景中添加了一个主摄像头。我希望用户能够将摄像机沿平行平面移动到地面。

我做了什么

我添加了一个我在网上发现的启动摄像头代码,以及一个事件系统,僵硬的身体,光线施法者,以及我在网上看到的一些其他东西。所有这些组件都在同一层中。

问题

当我将相机脚本的更新方法用于测试但它没有接收到任何其他事件时,即使它实现了适当的接口,也会受到影响。我猜测我有一些东西阻止了输入命中脚本,或者我没有我需要的组件来触发这些事件。

我现在正在桌面上进行测试,但我想让它在移动设备上运行(尽管我已经阅读了我订阅的事件应该是通用的)。到目前为止,任何人都可以发现我的设置中的任何疏忽或缺陷吗?这是一些截图。

谢谢!

我的设置

enter image description here

编辑:根据要求,这是我正在使用的相机脚本。我知道它没有做我想做的事情,但我现在想解决的问题是为什么它似乎没有正确连线。就像我说的,如果我在这里放置一个更新方法,它会被击中但我的其他日志都没有被击中。

using UnityEngine;
using UnityEngine.EventSystems;

// The touch is in 2D but the scene is in 3D, so touch.x => scene.x, touch.y => scene.z, and nothing change (0) => scene.y since y is up


public class TouchCamera : MonoBehaviour,
  IPointerDownHandler,
  IDragHandler,
  IPointerUpHandler
{
private Vector3 prevPointWorldSpace;
private Vector3 thisPointWorldSpace;
private Vector3 realWorldTravel;

private int drawFinger;
private bool drawFingerAlreadyDown;


public void OnPointerDown(PointerEventData data)
{
    Debug.Log("Pointer down");
    if (drawFingerAlreadyDown == true)
        return;
    drawFinger = data.pointerId;
    drawFingerAlreadyDown = true;

    prevPointWorldSpace = data.pointerCurrentRaycast.worldPosition;
    // in this example we'll put it under finger control...
    GetComponent<Rigidbody>().isKinematic = false;
}

public void OnDrag(PointerEventData data)
{
    Debug.Log("Pointer drag");
    if (drawFingerAlreadyDown == false)
        return;
    if (drawFinger != data.pointerId)
        return;

    thisPointWorldSpace = data.pointerCurrentRaycast.worldPosition;

    realWorldTravel = thisPointWorldSpace - prevPointWorldSpace;
    _processRealWorldtravel();

    prevPointWorldSpace = thisPointWorldSpace;
}

public void OnPointerUp(PointerEventData data)
{
    Debug.Log("Pointer up");
    if (drawFinger != data.pointerId)
        return;

    drawFingerAlreadyDown = false;
    GetComponent<Rigidbody>().isKinematic = false;
}

private void _processRealWorldtravel()
{
    Debug.Log("Updating camera position");
    Vector3 pot = transform.position;

    pot.x += realWorldTravel.x;
    pot.z += realWorldTravel.y;
    transform.position = pot;
}
}

解决方案的最终修改 非常感谢Juan Bayona Beriso帮助我聊聊这个配置。以下是我们最终得到的结果:

相机对象附有一个Rigidbody和Physics 2D Raycaster。该场景现在有一个新的Canvas对象,其中有一个Graphics Raycaster(阻塞掩码设置为所有内容,阻塞对象设置为none)和一个启用了独立输入模块的事件系统。该画布还有一个子UI对象,它覆盖屏幕并附加了相机脚本。作为一个好奇心,它需要一个文本组件,以便脚本开始接收事件 - 这只在选择了Raycast Target选项时产生了不同。屏幕截图如下。

Main Camera

Canvas

Camera Script Container

Script Exerpt

1 个答案:

答案 0 :(得分:1)

我认为您滥用EventSystemOnPointerDownOnDrag以及所有这些功能,当您PhysicsRaycaster中有Camera时,系统会调用这些功能您可以使用对象按下或拖动UI元素或对象。

在你的代码中,你没有任何这些,你有一个摄像头,所以你实际上并没有指向它或拖动它。

您有两种选择:

将此脚本放在具有相机内部的对撞机或GUI元素并随之移动的平面中,或使用Input.GetMouseButtonDown函数中的Input.GetMouseButtonUpUpdate