c# - 用鼠标 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
解决方案
您提供的示例不起作用,因为您提供的 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));
}
如果您的相机要离飞机更近或更远,请确保添加一些东西来保持与相机的距离更新。
也就是说,对于大多数将玩家绑定到鼠标光标的游戏来说,这通常不是您想要的。通常,您需要某种输入来将玩家向某个方向移动一定量。如果这就是您要寻找的内容,那么太空射击教程的这一部分是对玩家运动的一个很好的介绍(尽管代码本身可能已经过时)。
推荐阅读
- sql-server - Azure SQL 旧基数估计不像 SQL Server 2016 那样工作
- angular - 来自数组的打字稿枚举
- javascript - 在 snapshotChanges 中添加文档会添加 2 个文档
- apache-spark - Spark:错误应用程序已被杀死。原因:所有master都没有反应
- android - Monkeyrunner 问题
- python - 如何生成具有 V 个可能值的 N 个插槽的所有可能组合?
- docker - Confluent Kafka Connect Docker 容器问题
- javascript - 如果为空值,则提高输入工具提示
- kotlin - 如何将依赖类类型的类似代码减少到父级?
- python - 使用 NLTK/NaiveBayesClassifier,始终在测试数据上获得“正”输出