首页 > 解决方案 > 用鼠标 x 轴控制播放器 z 轴

问题描述

我正在尝试将玩家移动到游戏中鼠标的位置。现在沿 x 轴的移动工作正常,但我希望鼠标 y 轴控制角色沿 z 轴的移动(因为我的自上而下的相机的 y 是世界 z)。

现在鼠标 y 控制玩家 y,在游戏中看起来像这样。

它的代码如下所示:

public Vector2 mousePos;
private Vector3 playerPos;

void update()
{
    // Get mouse position from player
    mousePos = Input.mousePosition;

    // Move player with mouse
    playerPos = new Vector3(mousePos.x, 0, mousePos.y);
    transform.position = Camera.main.ScreenToWorldPoint(playerPos);
}

然后我试着像这样交换y和z

playerPos = new Vector3(mousePos.x, mousePos.y, 0);

但是这个片段并没有让我控制 z 轴,而是导致玩家失去所有运动。

我对编码很陌生,所以我可能会遗漏一些非常明显的东西。我究竟做错了什么?

统一版本:2018.4.21f1

标签: c#unity3d

解决方案


您提供的示例不起作用,因为您提供的 az 坐标为 0,并且当在透视相机上调用时,Camera.ScreenToWorldPoint会进行一些矢量数学运算,因此在您的场景视图中,您的播放器可能正漂浮在您的相机顶部。我无法解释实际的数学,因为我不明白,但幸运的是我们俩都不需要!从本质上讲,z 坐标表示放置点距相机多远,并且由于透视相机的视锥体更靠近相机,因此将其置于 0 意味着它无处可去。你可以在这里看到如何将对象从相机移得更远需要它移动得更远以匹配鼠标位置。

更大的问题是你的方法是错误的,还有更好的方法。Camera.ScreenToWorldPoint根据相机正在查看的内容将鼠标坐标转换为世界空间坐标,因此您实际上是在翻转 y 和 z 坐标,然后将其输入到确定需要翻转哪些坐标的方法中。

看起来此脚本已附加到您的玩家游戏对象,因此应如下所示:

Camera cam;
[Range(1,10)]  //this just creates a slider in the inspector
public int distanceFromCamera;

void Start()
{
    //calling Camera.main is a shortcut for 
    //FindGameObjectsWithTag("MainCamera")
    //so you should avoid calling it every frame
    cam = Camera.main;
}

void Update()
{
    //This will work for both perspective and orthographic cameras
    transform.position = cam.ScreenToWorldPoint(
        Input.mousePosition + new Vector3(0,0,distanceFromCamera));
}

如果您的相机要离飞机更近或更远,请确保添加一些东西来保持与相机的距离更新。

也就是说,对于大多数将玩家绑定到鼠标光标的游戏来说,这通常不是您想要的。通常,您需要某种输入来将玩家向某个方向移动一定量。如果这就是您要寻找的内容,那么太空射击教程的这一部分是对玩家运动的一个很好的介绍(尽管代码本身可能已经过时)。


推荐阅读