C# Unity-跟随鼠标时捕捉到网格

C# Unity-跟随鼠标时捕捉到网格,c#,unity3d,C#,Unity3d,尝试创建一个类似Connect 4的游戏。我使板模型的孔与网格对齐,这样我就可以轻松地将圆放入其中 问题是,在unity中,我不知道如何使对象跟随鼠标,同时也捕捉到网格 代码: 以前。我在自己的数学课(MathHelper)上有这些。它将值捕捉为另一个值的倍数(游戏中每个插槽的距离) 因此,在根据鼠标位置获取值后,通过“捕捉”运行该值,然后将结果应用于游戏对象的变换位置。像这样: transform.position=MathHelper.snap(Input.MousePosition,24)

尝试创建一个类似Connect 4的游戏。我使板模型的孔与网格对齐,这样我就可以轻松地将圆放入其中

问题是,在unity中,我不知道如何使对象跟随鼠标,同时也捕捉到网格

代码:

以前。我在自己的数学课(MathHelper)上有这些。它将值捕捉为另一个值的倍数(游戏中每个插槽的距离)

因此,在根据鼠标位置获取值后,通过“捕捉”运行该值,然后将结果应用于游戏对象的变换位置。像这样:

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;
    }