【问题标题】:Unity - Snap to grid while following mouseUnity - 跟随鼠标对齐网格
【发布时间】:2017-06-22 18:40:23
【问题描述】:

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

问题是我不知道如何统一地使对象跟随鼠标同时也捕捉到网格。

代码:

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

    }
}

【问题讨论】:

  • 在行上方添加一个不可见目标,如果这是统一 5,您可以在不可见图像中使用检查鼠标是否在目标上,将检查块放在目标中

标签: c# unity3d


【解决方案1】:

I've done this 之前。我在自己的数学课(MathHelper)中有这些。它将值捕捉到另一个值的倍数(游戏中每个插槽的距离)。

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

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

transform.position = MathHelper.snap(Input.MousePosition, 24);

如果Input.MousePosition 不能直接转换为您的坐标空间以及捕捉距离(24 来自我自己的用法,您的可能是 1、5、10、50),您可能不得不摆弄它, 或 100)。

【讨论】:

  • 您如何解决当不精确发生时得到 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) 位置。
  • Since in my case my grid tile (0,0) doesn't necessary go to world (0,0) position 好吧,你是对的,我没有考虑到这一点。我也不打算修复它来处理它,使用本地位置和Transform.TransformPoint() 并在网格-(0,0) 是本地-(0,0) 的本地坐标中工作。
  • 我已经做到了,问题是从鼠标转换到本地点的世界点是不精确开始蔓延的地方。我不知道人们通常如何解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多