如何修复关卡编辑器中的放置工具?

How do i fix the placement tool in my level editor?

所以我目前正在制作游戏,并且我最近添加了一个关卡编辑器,但是放置工具无法正常工作。

https://youtu.be/MuUvnVTL6eg

如果你看过这个视频,你可能已经意识到块放置的工作原理与在 ms pain 中使用 alt 放置矩形非常相似,我希望它像在 ms pain 中不使用 alt 放置矩形一样工作 xd .

我正在使用此代码放置方块:

if (Input.GetKeyDown(KeyCode.Mouse0)){
    startDrawPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    tmpObj = spawnObject(blocks[selected].gameObject, startDrawPos);
    drawing = true;
}

if (Input.GetKey(KeyCode.Mouse0)){
    Vector2 mPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    Vector2 tmpScale = new Vector2(startDrawPos.x - mPos.x, startDrawPos.y - mPos.y);
    tmpObj.transform.localScale = tmpScale;
}

if (Input.GetKeyUp(KeyCode.Mouse0))
{
    drawing = false;
    var scale = tmpObj.transform.localScale;
    //Code below destroys the object if it's too small to avoid accidental placements
    if (scale.x <= 0.1 && scale.x > -0.1 || scale.y <= 0.1 && scale.y > -0.1)
    {
        Destroy(tmpObj);
    }
}

(所有这些代码都在 Update() 函数中) (spawnObject 函数只是实例化对象预制件)

代码有点多,但与块的位置无关,它只是检测选择了哪个块并决定是否可以调整大小。

我解决了这个问题。但是因为你的完整脚本没有问题,所以我用 IEnumerator 重建了代码,在这里,通过按下鼠标左键, IEnumerator 被激活并且所有命令都被组合在一个方法中,使代码更高效。

private void Update()
{
    if (Input.GetKeyDown(KeyCode.Mouse0)) StartCoroutine(DrawRect());
}

Desktop Rect 公式如何工作?

通过运行IEnumerator,代码先记录下鼠标的起点。它还制作了一个简单的立方体,因为我无权访问您的对象。现在直到按下鼠标。将 Rect 调整为当前点和记录点之间的差异。唯一的问题是为了避免 ALT 控制,你必须将它放在当前点和初始点之间。之所以加了camera forward是为了在camera中看到。


cubeObject.transform.position = (startDrawPos + currentDrawPos) / 2;

最终的DrawRect结构如下:

public IEnumerator DrawRect()
{
    drawing = true;
    var scale = Vector2.zero;
    
    var startDrawPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    
    var cubeObject = GameObject.CreatePrimitive(PrimitiveType.Cube);
    
    while (Input.GetKey(KeyCode.Mouse0))
    {
        var currentDrawPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        cubeObject.transform.position = (startDrawPos + currentDrawPos) / 2 + Camera.main.transform.forward * 10;
        
        scale  = new Vector2(startDrawPos.x - currentDrawPos.x, startDrawPos.y - currentDrawPos.y);
        
        cubeObject.transform.localScale = scale;
        
        yield return new WaitForEndOfFrame();
    }
    
    if (scale.x <= 0.1 && scale.x > -0.1 || scale.y <= 0.1 && scale.y > -0.1) Destroy(cubeObject);
    drawing = false;
}