Unity3D 一些关于坐标的问题

      最近刚解除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) };
    }

}


  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值