接触NGUI 的时日还不是很多,最近在一个2d游戏中遇到了一个摄像机的移动问题,纠结了好久,不过最终还是找到了解决方法。
float speed = 0.5f;
Vector2 start, stop;
Vector2 step;//鼠标点击移动的向量
private Vector3 Velocity = Vector3.zero;
Vector2 pstart, pstop, pstep;
float border_y, border_x;//摄像机的边界值
int curStep, maxStep;
Transform common;
public GameObject backGround;
public GameObject panelPlant;
Vector2 startPosition, stopPosition;//鼠标点击开始和结束时的位置
Vector2 neoPosition;
// Use this for initialization
void Start()
{
startPosition = Input.mousePosition;
stopPosition = Input.mousePosition;
neoPosition = new Vector2(-1, -1);
border_x =60;
border_y = 120f;
curStep = 0;
maxStep = 0;
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButton(0) && UICamera.hoveredObject != null && UICamera.hoveredObject.name == "BackGround")
{
stopPosition = Input.mousePosition;
if (startPosition.x < 0) { startPosition = stopPosition; return; }
step = startPosition - stopPosition;
startPosition = stopPosition;
if (step.x < 2 && step.y < 2 && step.x > -2 && step.y > -2) return;//avoid move when click
step *= 1.3f;
transform.localPosition = new Vector2(transform.localPosition.x + step.x, transform.localPosition.y + step.y);
if (transform.localPosition.x < -border_x)
{
transform.localPosition = new Vector2(-border_x, transform.localPosition.y);
}
if (transform.localPosition.x > border_x)
{
transform.localPosition = new Vector2(border_x, transform.localPosition.y);
}
if (transform.localPosition.y < -border_y)
{
transform.localPosition = new Vector2(transform.localPosition.x, -border_y);
}
if (transform.localPosition.y > border_y)
{
transform.localPosition = new Vector2(transform.localPosition.x, border_y);
}
}
else if (startPosition.x >= 0) { startPosition = neoPosition; }
}
需求是在一个大背景地图上,需要鼠标点击或触摸(手机版)背景地图拖动摄像机移动。如果是3d的话,可以用射线去检测,而NGUI是不支持2d射线检测了。在背景地图上,如果存在其他UI界面,如何控制鼠标点击的物体是背景这就是主要的问题。楼主找了好久,终于找到一个方法可以实现。下面是代码
Vector2 start, stop;
Vector2 step;//鼠标点击移动的向量
private Vector3 Velocity = Vector3.zero;
Vector2 pstart, pstop, pstep;
float border_y, border_x;//摄像机的边界值
int curStep, maxStep;
Transform common;
public GameObject backGround;
public GameObject panelPlant;
Vector2 startPosition, stopPosition;//鼠标点击开始和结束时的位置
Vector2 neoPosition;
// Use this for initialization
void Start()
{
startPosition = Input.mousePosition;
stopPosition = Input.mousePosition;
neoPosition = new Vector2(-1, -1);
border_x =60;
border_y = 120f;
curStep = 0;
maxStep = 0;
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButton(0) && UICamera.hoveredObject != null && UICamera.hoveredObject.name == "BackGround")
{
stopPosition = Input.mousePosition;
if (startPosition.x < 0) { startPosition = stopPosition; return; }
step = startPosition - stopPosition;
startPosition = stopPosition;
if (step.x < 2 && step.y < 2 && step.x > -2 && step.y > -2) return;//avoid move when click
step *= 1.3f;
transform.localPosition = new Vector2(transform.localPosition.x + step.x, transform.localPosition.y + step.y);
if (transform.localPosition.x < -border_x)
{
transform.localPosition = new Vector2(-border_x, transform.localPosition.y);
}
if (transform.localPosition.x > border_x)
{
transform.localPosition = new Vector2(border_x, transform.localPosition.y);
}
if (transform.localPosition.y < -border_y)
{
transform.localPosition = new Vector2(transform.localPosition.x, -border_y);
}
if (transform.localPosition.y > border_y)
{
transform.localPosition = new Vector2(transform.localPosition.x, border_y);
}
}
else if (startPosition.x >= 0) { startPosition = neoPosition; }
}
UICamera.hoveredObject 这个方法的意思就是,它会检测到由UICamera发出的射线所碰触的最后一个UI。(当然别忘了加collider。。。。)。这样就大功告成,只有当鼠标点击背景是,才会移动。这个方法的脚本挂在摄像机上就OK了。