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



所以我目前正在制作一款游戏,我最近添加了一个关卡编辑器,但是放置工具不像我想的那样工作。

https://youtu.be/MuUvnVTL6eg

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

我用下面的代码来放置block:

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

桌面矩形公式是如何工作的?

通过运行IEnumerator,代码首先记录鼠标的起始点。它也是一个简单的立方体因为我无法访问你的对象。直到按下鼠标。将Rect调整为当前点和记录点之间的差值。唯一的问题是,为了避免ALT控件,您必须将其放置在当前点和初始点之间。向前添加摄像头的原因是为了在摄像头中看到。


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

最新更新