如何修复关卡编辑器中的放置工具?
How do i fix the placement tool in my level editor?
所以我目前正在制作游戏,并且我最近添加了一个关卡编辑器,但是放置工具无法正常工作。
如果你看过这个视频,你可能已经意识到块放置的工作原理与在 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;
}
所以我目前正在制作游戏,并且我最近添加了一个关卡编辑器,但是放置工具无法正常工作。
如果你看过这个视频,你可能已经意识到块放置的工作原理与在 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;
}