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

C# 是什么阻止我的相机移动脚本接收输入事件?,c#,unity3d,C#,Unity3d,谢谢你的阅读。我试着把这个贴在unity answers上,但是已经24小时了,它还没有失去节制,所以也许我在这里会有更好的运气 背景 我对团结非常陌生,我知道我必须缺少一些关键的知识来将这一切联系起来。我创建了一个带有占位符地形的空白游戏,并在3d正交场景中添加了一个主摄像头。我希望用户能够将相机沿平行平面移动到地面 我所做的 我在网上找到了一个启动摄像头代码,还有一个事件系统、刚体、光线投射器,还有一些我在网上看到的关于这类事情的东西。所有这些组件都在同一层中 问题 当我将照相机脚本的更新方

谢谢你的阅读。我试着把这个贴在unity answers上,但是已经24小时了,它还没有失去节制,所以也许我在这里会有更好的运气

背景

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

我所做的

我在网上找到了一个启动摄像头代码,还有一个事件系统、刚体、光线投射器,还有一些我在网上看到的关于这类事情的东西。所有这些组件都在同一层中

问题

当我将照相机脚本的更新方法放入测试时,它的更新方法被命中,但它不会接收任何其他事件,即使它实现了适当的接口。我猜我有什么东西阻止输入命中脚本,或者我没有触发这些事件所需的组件

我现在正在桌面上测试,但我希望它能在移动设备上运行,尽管从我读到的我订阅的活动应该是通用的。到目前为止,有人能发现我的设置中有任何疏忽或缺陷吗?这里是一些截图

谢谢

我的设置

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

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帮助我使用此配置进行聊天。以下是我们最终得出的现在有效的结论:

摄影机对象具有刚体和物理2D光线投射器。场景现在有一个新的画布对象,其中Graphics Raycaster blocking mask设置为everything,blocking objects设置为none,事件系统启用了独立输入模块。该画布还具有一个子UI对象,该对象覆盖屏幕并附加了摄影机脚本。奇怪的是,它需要一个文本组件才能让脚本开始接收事件——这只在选择“光线投射目标”选项时才起作用。下面是截图


我认为您误用了EventSystem、OnPointerDown、OnDrag和所有这些函数,当您的摄影机对象中有PhysicsRaycaster,并且您使用碰撞器在UI元素或对象上按下或拖动时,会调用它们

在你的代码中,你没有任何这些,你有一个相机,所以你实际上不是在它上面向下或拖动指针

您有两个选择:


将此脚本放置在带有碰撞器或GUI元素的平面中,该元素位于相机内部并随其移动,或者在更新函数中使用Input.getmousebuttonown、Input.GetMouseButtonUp

请复制并粘贴此脚本。已添加。正如我所说的,我更感兴趣的是没有正确连接的东西,而不是相机脚本如何做或不做我想做的事情。主要是我想点击调试日志。你只想用鼠标平移相机?就这样?是的,只是用鼠标或触摸来平移。一旦我知道我在做什么,我会添加缩略缩放和其他功能,但在我的脚本接收到事件之前,这些都不重要。根据文档,EventSystem的光线投射从相机进入深度,所以我认为问题出在这里。感谢您的回答。这已经开始有了一些意义。平面中的长方体碰撞器或绑定的gui元素之间是否有首选方法?我在想,如果我沿着对撞机的路线,一旦我开始用其他物体填充飞机,我可能会遇到问题,但我不确定。谢谢。我已经按照你的建议做了我理解的事情,但似乎我仍然有一些错误的想法。这是我的新设置:抱歉截图。如果更好的话,我可以把这个放在原来的帖子里。谢谢。我的相机现在有一个物理2d光线投射器,事件遮罩设置为“一切”。还没有变化。谢谢,但还是没有运气。我是否需要在某处添加一个事件系统,可能吗?让我们来看看。