首先是canvas的第一种渲染模式,全覆盖,顾名思义就是UGUI覆盖在任何的物体之上,适用于做一些普通的开发,这时候我们的UI坐标跟我们的屏幕坐标相同,
Vector2 mouseInput;
public Text _text;
public void Test()
{
if(Input.GetMouseButtonDown(0))
{
//鼠标点击的即为屏幕坐标,最简单的text组件跟随鼠标
mouseInput = Input.mousePosition;
_text.transform.position = mouseInput;
}
}
private void Update()
{
Test();
}
下面这种方式利用屏幕空间的本地坐标解决
public void Test()
{
mouseInput = Input.mousePosition;
//因为在ui坐标里,我们的锚点原因,需要把求出中心所在,不然回出现,位置出现一定偏差,当然我们定义一个offest也可以解决
Vector2 screenSize = new Vector2(Screen.width*0.5f, Screen.height*0.5f);
if(Input.GetMouseButtonDown(0))
{
_text.transform.localPosition= mouseInput-screenSize;
}
}
private void Update()
{
Test();
}
但是在我们的开发当中,一般要让场景的物体显示在UI之前,那么我们就不能使用刚刚的那种渲染模式,换成第二种即为屏幕空间-摄像机渲染,这种渲染模式存在单独的UI坐标,,转化起来相对麻烦,但是我们可能使用localPosition这一个参数实现坐标转化,这种渲染模式所渲染出来的图像取决于order layer与sorting layer的深度值。这个是基于视口坐标转化的,原理同上,只不过是把视口坐标映射到屏幕坐标上呢
Vector2 mouseInput;
public Text _text;
public void Test()
{
mouseInput = Input.mousePosition;
Vector2 screenPos = Camera.main.ScreenToWorldPoint(mouseInput);
//Vector2 screenSize = new Vector2(Screen.width*0.5f, Screen.height*0.5f);
Vector2 viewPos = Camera.main.ScreenToViewportPoint(mouseInput);//把屏幕坐标给到视口坐标
Vector2 ss = viewPos * new Vector2(Screen.width*0.5f, Screen.height*0.5f);//视口坐标*屏幕分辨率
if(Input.GetMouseButtonDown(0))
{
_text.transform.localPosition= mouseInput- ss;
}
}
private void Update()
{
Test();
}
讲世界空间的物体转化为屏幕空间,进而进行跟随,原理同第一个,不描述
在canvas的第三种渲染模式下,世界空间下面转化,但是会出现偏移,需要自行加上一个offest进行调节,渲染模式世界模式下的渲染,决定为death,距离摄像机的远近渲染
public void Test()
{
mouseInput = Input.mousePosition;
Vector2 screenPos = Camera.main.ScreenToWorldPoint(mouseInput);
Vector2 worldPos = Camera.main.ScreenToWorldPoint(screenPos);
if(Input.GetMouseButtonDown(0))
{
_text.transform.position = new Vector3(worldPos.x, worldPos.y, _text.transform.root.transform.position.z)+offest;
}
}
private void Update()
{
Test();
}