我正在尝试将关卡编辑器设置为用户可以在其中放置切片的位置。这是代码:
using UnityEngine;
using System.Collections;
public class TilePlacement : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown (0)) {
var clickPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0f);
clickPos = Camera.main.ScreenToWorldPoint (clickPos);
clickPos.z = 0f;
clickPos.x = Mathf.FloorToInt (clickPos.x);
clickPos.y = Mathf.FloorToInt (clickPos.y);
clickPos.x /= 3.2f;
clickPos.y /= 3.2f;
clickPos.x = Mathf.Round (clickPos.x);
clickPos.y = Mathf.Round (clickPos.y);
clickPos.x *= 3.2f;
clickPos.y *= 3.2f;
var go = new GameObject ();
go.AddComponent<SpriteRenderer> ();
go.GetComponent<SpriteRenderer> ().sprite = Sprite.Create(new Texture2D(32, 32), new Rect(0, 0, 32, 32), new Vector2(0, 0));
go.transform.localScale = new Vector3 (10f, 10f, 0f);
go.transform.position = clickPos;
}
}
}
此代码适用于放置图块,但用户必须单击图块的左下角,更改clickPos的公式似乎过于复杂,我认为有更好的方法。请帮我解决这两个问题
答案 0 :(得分:2)
您是否使用正交相机进行2D工作?在3D中,我会这样做,这也适用于2D平面。
Plane _groundPlane;
void Start()
{
_groundPlane = new Plane(Vector3.up, Vector3.zero);
}
void Update()
{
if (Input.GetMouseButtonDown(0) == false)
return;
int x = 0;
int z = 0;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
float distance;
if (_groundPlane.Raycast(ray, out distance))
{
Vector3 worldPosition = ray.GetPoint(distance);
x = Mathf.RoundToInt(worldPosition.x);
z = Mathf.RoundToInt(worldPosition.z);
Debug.DrawLine(Camera.main.transform.position, worldPosition);
Debug.LogFormat("Clicked positions: {0} | {1}", x, z);
}
}
我创建一个与默认网格平放的 Plane 。然后我对它做一个光线投射,从世界空间的鼠标屏幕位置找到命中点。我还将每个单元格的大小设置为单位,这样我就可以舍入到int来获取索引位置,这也可以作为世界变换位置。
如果您想保存光线投射并且不需要3D摄像机视角,您可以简单地获得您已经在做的鼠标世界位置。如果你将每个tile设置为一个单位,那么当舍入到int时,一切都会正常工作。