Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用鼠标x轴控制播放器z轴_C#_Unity3d - Fatal编程技术网

C# 用鼠标x轴控制播放器z轴

C# 用鼠标x轴控制播放器z轴,c#,unity3d,C#,Unity3d,我正在尝试将玩家移动到游戏中鼠标的位置。 现在沿x轴的移动很好,但我希望鼠标y轴控制角色沿z轴的移动(因为我的自顶向下相机的y轴是世界z轴) 现在鼠标y控制玩家y 它的代码如下所示: public Vector2 mousePos; private Vector3 playerPos; void update() { // Get mouse position from player mousePos = Input.mousePosition; // Move pl

我正在尝试将玩家移动到游戏中鼠标的位置。 现在沿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);
}
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));
}
然后我试着像这样交换y和z

playerPos = new Vector3(mousePos.x, mousePos.y, 0);
但是这段代码并没有让我控制z轴,反而使玩家失去了所有的移动

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


Unity版本:2018.4.21f1

您给出的示例不起作用,因为您提供的z坐标为0,并且在透视摄影机上调用时,
摄影机。ScreenToWorldPoint
会进行一些矢量计算,因此在场景视图中,您的播放器可能正漂浮在摄影机顶部。我无法解释实际的数学,因为我不懂,但幸运的是,我们都不需要解释!从本质上讲,z坐标表示放置点离摄影机的距离,并且由于透视摄影机的视锥台距离摄影机越来越近,因此将其放置在0表示它无处可去。将对象移动到离摄影机较远的位置时,需要将其移动得更远以匹配鼠标位置

更大的问题是你的方法是错误的,还有更好的方法
Camera.ScreenToWorldPoint
根据相机所看到的内容将鼠标坐标转换为世界空间坐标,因此基本上是翻转y和z坐标,然后将其输入到一个方法中,该方法计算出需要翻转的坐标

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

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);
}
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));
}
如果您的相机要离平面更近或更远,请确保添加一些东西,以保持与相机的距离保持更新


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

谢谢
如果其他人使用此代码并找到他们的角色,您只需更改第二行中的范围值以增加滑块的范围。我会看一下教程,找到实现这个机制的常规方法。啊,是的,我应该解释一下。我只是把range属性放在那里以便于演示。到摄影机的距离应设置为摄影机与角色所需位置之间的任何距离。如果相机将要移动,您可以在代码中设置/更新它。