最近刚解除u3d, 我是想用它来做一些简单的游戏,他吸引我的地方是他的ui插件,我也是从ui插件入手学习的, 完成的看了一个介绍NGUI的视频, 他的设计理念深深的吸引了我,他在设计模式上是很合理的,就这一定就非常值得我们去学习,我的感觉是他把数据(GameObject)和行为(Component)作到了完美的分离和结合。好了,废话少说。
问题: 我在开发一个测试东西的时候,想在界面里面嵌入一个原生的2DSprite,我想如果让我的sprite大小和ngui的大小一致呢,他们如何配合?
为了解决这个问题,我需要研究他们的大小关系。我使用的视图模型是2D的模式,透视方式是正交的。查了很多资料,发现中国的程序员喜欢扯蛋的多,很多都没有从根本上把这个问题说清楚, 下面是我的理解,希望对遇到这个我问题的人有所帮助。
1: 理解清楚Camer是如何工作的,干什么用的。 其实,相机决定了我们可以看到什么,这里我们需要关注的参赛是相机的size, 入下面的图,方框表示相机可以看到的部分,AB时间相机的Size, 相机的size其实就是一个巨型,在数值上宽和高是一样的,但在像素上是不一样的,这一点特别重要,一定要理解清楚。
2: 我们就不说view了,这里我们假设的view是默认的大小,
3: 下面我们说说在场景里面像素和世界坐标大小的对应关系。在u3d(5.02版本)默认的时候,Sprite.pixelsPerUnit = 100, 说明了这个问题,就是100个像素和世界坐标中的1个单位的转换关系。 下面明白了吧。
4:NGUI的大小转换在UIRoot的设置里面会有的的,我们可以看的比较明白。 NGUI里面的大小,设置里面也很清楚。
就说这些吧,感觉还是不很清楚。
public class TestSize : MonoBehaviour {
public GameObject Myspobj = null;
public GameObject Uiobj = null;
// Use this for initialization
void Start () {
TestPicSize();
}
// Update is called once per frame
void Update () {
BBUpdate();
}
public void TestPicSize()
{
AAStart();
Sprite nouiobj = Myspobj.GetComponent<SpriteRenderer>().sprite;
int A = 10;
if (A > 0)
return;
UISprite isuiobj = Uiobj.GetComponent<UISprite>();
Debug.Log("drawingDimensions="+isuiobj.drawingDimensions.ToString() );
//isuiobj.SetDimensions((int)(nouiobj.bounds.size.x * 50), (int)(nouiobj.bounds.size.y * 50));
Debug.Log("drawingDimensions=" + isuiobj.drawingDimensions.ToString());
Camera aUiCamera = UICamera.FindCameraForLayer(Uiobj.layer).GetComponent<Camera>();
//Vector3 Uiobj_screenpos = aUiCamera.WorldToScreenPoint(Uiobj.transform.position);
//Uiobj_screenpos = aUiCamera.WorldToScreenPoint(new Vector3(0, 0, 0));
//Vector3 myspobj_screenpos = Camera.main.WorldToScreenPoint(Myspobj.transform.position);
//myspobj_screenpos = Camera.main.WorldToScreenPoint(new Vector3(0, 0, 0));
//myspobj_screenpos.x += 100;
Vector3 temp_screenpos = new Vector3(200, 200, 0);
Uiobj.transform.position = aUiCamera.ScreenToWorldPoint(temp_screenpos);
temp_screenpos.z = 10;
temp_screenpos.x = 300;
Myspobj.transform.position = Camera.main.ScreenToWorldPoint(temp_screenpos);
Debug.Log("Myspobj:pos=" + Myspobj.transform.position.ToString());
}
void GetMyChildAA()
{
List<Component> mButList = new List<Component>();
Myspobj.GetComponents(mButList);
foreach ( Component t in mButList )
{
Debug.Log(t.ToString());
}
}
//
//素材求//
public Material spriteMaterial;
//顶点数//
private int verticesCount = 4;
// Use this for initialization
void AAStart()
{
initSprite();
}
// Update is called once per frame
void BBUpdate() { }
//根据宽高生成对应的面//
private void initSprite()
{
//标准摄像头的高度//
float standardCameraSize = Camera.main.orthographicSize;
//标准屏幕的高度//
float standardHeight = Camera.main.pixelHeight;
//计算像素和世界单位的比值//
float glTopixelRatio = standardCameraSize * 2.0f / standardHeight;
//获取图片的像素宽高//
int pixelHeight = spriteMaterial.mainTexture.height;
int pixelWidth = spriteMaterial.mainTexture.width;
Debug.Log("pixeW:" + pixelWidth + ",pixeH:" + pixelHeight);
//得到MeshFilter对象//
MeshFilter meshFilter = gameObject.GetComponent<MeshFilter>();
if (meshFilter == null)
{
//为null时,自动添加//
meshFilter = gameObject.AddComponent<MeshFilter>();
MeshRenderer meshRenderer = gameObject.AddComponent<MeshRenderer>();
meshRenderer.sharedMaterial = spriteMaterial;
}
//得到对应的网格对象//
Mesh mesh = meshFilter.mesh;
//三角形顶点的坐标数组//
Vector3[] vertices = new Vector3[verticesCount];
//得到三角形的数量//
//int trianglesCount = verticesCount - 2;
//三角形顶点数组//
int[] triangles = new int[verticesCount * 3];
float glWidth = pixelWidth * glTopixelRatio;
float glHeight = pixelHeight * glTopixelRatio;
//以当前对象的中心坐标为标准//
float xposaa = standardCameraSize - glWidth;
float yposaa = standardCameraSize - glHeight;
vertices[0] = new Vector3(xposaa + 0, yposaa+0, 0);
vertices[1] = new Vector3(xposaa + 0, yposaa+glHeight, 0);
vertices[2] = new Vector3(xposaa + glWidth, yposaa+0, 0);
vertices[3] = new Vector3(xposaa + glWidth, yposaa+glHeight, 0);
mesh.vertices = vertices;
//绑定顶点顺序//
triangles[0] = 0;
triangles[1] = 1;
triangles[2] = 2;
triangles[3] = 1;
triangles[4] = 3;
triangles[5] = 2;
mesh.triangles = triangles;
mesh.uv = new Vector2[] { new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 0), new Vector2(1, 1) };
}
}