美文网首页Unity3D
Unity中对transform.position.x/y/z直

Unity中对transform.position.x/y/z直

作者: 糊涂小蜗牛 | 来源:发表于2018-07-18 16:45 被阅读0次
    描述

    在Unity学习开发过程中,会遇到通过对transform.position.x/y/z直接赋值时报错:


    但是transform.position = Vector3.zero;却是可以的。
    究其原因

    查看Transform的脚本你会发现position是Vector3类型,并且是一个自动实现的属性。

           //
           // Summary:
           //     The position of the transform in world space.
           public Vector3 position { get; set; }
    

    继续查看Vector3的脚本你会发现Vector3是struct类型

        public struct Vector3
        {
           public const float kEpsilon = 1E-05F;
            //
            // Summary:
            //     X component of the vector.
            public float x;
            //
            // Summary:
            //     Y component of the vector.
            public float y;
            //
            // Summary:
            //     Z component of the vector.
            public float z;
    

    Vector3是结构体类型,而结构体为值类型,值类型在通过方法传递的时候,传递的只是值的副本。
    当使用

    transform.position.x = 10;
    

    时,这个position是调用transform的get方法,得到一个transform里记录位置的Vector3私有成员position的临时副本,然后再对这个副本进行修改,所以不会更改transform中真实的私有成员position。这样的修改是毫无意义的,编译器会禁止这样的修改操作,所以报错。
    但当使用

    transform.position = Vector3.zero;
    

    时,C#发现需要对transform的私有成员进行修改,会自动调用set方法,而这个set方法是能修改transform的私有成员的。

    补充
    public Vector3 position { get; set; }
    

    等价于

        private Vector3 mPosition;
        public Vector3 position
        {
            get{
                return mPosition;
            }
            set
            {
                mPosition = value;
            }
        }
    

    相关文章

      网友评论

        本文标题:Unity中对transform.position.x/y/z直

        本文链接:https://www.haomeiwen.com/subject/ohoopftx.html