C# Unity-跟随鼠标时捕捉到网格
尝试创建一个类似Connect 4的游戏。我使板模型的孔与网格对齐,这样我就可以轻松地将圆放入其中 问题是,在unity中,我不知道如何使对象跟随鼠标,同时也捕捉到网格 代码: 以前。我在自己的数学课(MathHelper)上有这些。它将值捕捉为另一个值的倍数(游戏中每个插槽的距离) 因此,在根据鼠标位置获取值后,通过“捕捉”运行该值,然后将结果应用于游戏对象的变换位置。像这样:C# Unity-跟随鼠标时捕捉到网格,c#,unity3d,C#,Unity3d,尝试创建一个类似Connect 4的游戏。我使板模型的孔与网格对齐,这样我就可以轻松地将圆放入其中 问题是,在unity中,我不知道如何使对象跟随鼠标,同时也捕捉到网格 代码: 以前。我在自己的数学课(MathHelper)上有这些。它将值捕捉为另一个值的倍数(游戏中每个插槽的距离) 因此,在根据鼠标位置获取值后,通过“捕捉”运行该值,然后将结果应用于游戏对象的变换位置。像这样: transform.position=MathHelper.snap(Input.MousePosition,24)
transform.position=MathHelper.snap(Input.MousePosition,24)代码>
如果Input.MousePosition
不能直接转换到坐标空间以及捕捉距离(24是我自己使用的,你的可能是1、5、10、50或100),你可能不得不摆弄它。在行上方添加一个不可见的目标,如果这是unity 5,您可以在“不可见图像”检查中使用,查看鼠标是否在目标上,将复选框放在target中。您是否可以回避以下问题:当不精确发生时,您得到的是1.99999而不是2,当不应该时,它最终以1个平铺结束?@WDUK您必须提供一组输入示例,以这种方式导致浮点除法的偏移量小于epsilon。我敢打赌,(a)不存在可以合理假设正在使用的小值的示例,或者(b)错误量小于用户会注意到的值。就x轴而言,目前我的原点为1.2345,世界点为2.2345。减去差值,然后进行地板铺设以获得瓷砖位置,您应该得到1,但有时差值计算为0.9999而不是1或1.0001,因此,如果您有0.9999并进行地板铺设,则瓷砖编号为0而不是1。因为在我的例子中,我的网格图块(0,0)没有必要转到世界(0,0)位置。因为在我的例子中,我的网格图块(0,0)没有必要转到世界(0,0)位置。
好的,你是对的,我没有解释。我也不打算修复它来处理它,使用局部位置和Transform.TransformPoint()
并在局部坐标中工作,其中网格-(0,0)是局部的-(0,0)。我已经解决了,问题是从鼠标的世界点转换到局部点是不精确开始蔓延的地方。我不知道人们通常如何解决这个问题。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LockToGrid : MonoBehaviour {
public float gridSize;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
SnapToGrid(gameObject);
}
void SnapToGrid(GameObject Object) {
var currentPos = Object.transform.position;
Object.transform.position = new Vector3(Mathf.Round(currentPos.x / gridSize) * gridSize,
currentPos.y,
currentPos.z);
}
}
public static Vector3 snap(Vector3 pos, int v) {
float x = pos.x;
float y = pos.y;
float z = pos.z;
x = Mathf.FloorToInt(x / v) * v;
y = Mathf.FloorToInt(y / v) * v;
z = Mathf.FloorToInt(z / v) * v;
return new Vector3(x, y, z);
}
public static int snap(int pos, int v) {
float x = pos;
return Mathf.FloorToInt(x / v) * v;
}
public static float snap(float pos, float v) {
float x = pos;
return Mathf.FloorToInt(x / v) * v;
}