Unity3d中transform.position.set无效的问题

最近在用Unity3d的时候发现一件很诡异的事情。

当使用下面句子的时候,物体的位置并没有被成功设置成x,y,z。

transform.position.Set(x, y, z);

而换用下面句子的时候则可以成功设置。

transform.position = new Vector3 (x, y, z);

查了下资料,发现和C#的类中的get、set有关,下面是一个get、set的典型例子。

using System;
class MyClass
{
    int integer;
    public int Integer
    {
        get {return integer;}
        set {integer=value;}
    }
}
class Test
{
    public static void Main()
    {
        MyClass MyObject=new MyClass();
        Console.Write(MyObject.Integer);
        MyObject.Integer++;
        Console.Write(MyObject.Integer);
    }
} 

可以看到C#做了一些简化,执行

MyObject.Integer++;

时,实际上是先调用了get获取了integer的值,然后再调用set将integer赋值为integer+1。

回到开头提出的问题,transform.position其实既有get又有set

当使用

transform.position.Set(x, y, z);

时,其实这个position只是调用了transform的get方法,得到了一个transform里的记录位置的Vector3私有成员的临时副本(类似上面例子的integer),然后再对这个Vector3的副本执行Set,所以不会更改到transform里真实的私有成员。

但当使用

transform.position = new Vector3 (x, y, z);

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

因此只有使用第二种方法时才能成功修改位置。

时间: 2024-11-13 08:11:49

Unity3d中transform.position.set无效的问题的相关文章

unity3d中Transform组件变量详解

Transform组件是每个游戏对象必须有的一个组建,因为你创建一个空物体,它也有该组建,因为unity3d是面向组建开发的一款游戏引擎.通过一张图片来看看它的属性 你可以在通过代码查看这些属性的区别 Debug.Log("position " + transform.position); //世界坐标的位置 Debug.Log("localPosition " + transform.localPosition); //相对于父位置的坐标 即把父物体当作自己的中心

unity3d中的ngui的一些笔记

一. NGUI的直接用法 1. Attach a Collider:表示为NGUI的某些物体添加碰撞器,如果界面是用NGUI做的,只能这样添加.(注:用Component添加无效). 2. Attach an Anchor:表示为该物体添加了UIAnchor脚本,作用是避免像素偏移的问题 3. Attach UIStretch:表示为该物体添加了UIStretch脚本,提供缩放功能 4. Make Pixel Perfect:表示自动为你调整Transform的尺寸 5. Create a Pa

(转)Unity3D中移动物体位置的几种方法

1. 简介 在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale). 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position). 2.1 Transform.Tra

Unity3D 中 Generic 动画导入设置和 Root Motion 之间的关系

2条评论 Unity3D 的 Mecanim 动画系统可以直接复用 3DS MAX 中制作的动画文件中的位移,这个就是通过 applyRootMotion 来达成的,我们只需要在使用 Animator 控制动画播放的同时,设置 Animator 的 applyRootMotion 字段为 True 就 OK 了. 那么怎么来利用这个特性达成我们想要的一些效果呢?这个 applyRootMotion 到底指的是啥呢? ApplyRootMotion,从字面上理解来看,是『应用根节点的运动』,听起来

(转)Unity3d中的碰撞检测

很多时候,当我们的主角与其他GameObject发生碰撞时, 我们需要做一些特殊的事情,比如:子弹击中敌人,敌人就得执行一系列的动作.这时,我们就需要检测到碰撞现象,即碰撞检测.这一篇,我来具体谈谈自己所了解的碰撞检测,希望高手不佞赐教. 首先,我们得明确一点:即产生碰撞信息所需要的条件.事实上,在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器.这两种方式的应用非常广泛.为了完整的了解这两种方式,我们必须理解以下概念:    (一)碰撞器是一群组件,它包含了

CSS中transform 属性

CSS中transform 属性允许你修改CSS可视化模型的坐标空间.通过transform,可以让元素进行移动(translate).旋转(rotate).缩放(scale).倾斜(skew). 如果该属性有一个非none值, 将会产生一个层叠上下文. 在这种情况下 对象将作为它包含的 position: fixed 元素的包含块(a containing block). 初始值 none 适用元素 transformable elements 是否是继承属性 否 Percentages re

Unity3D中Javascript的基本使用与介绍详解

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. 在Unity中脚本是必不可少的.因为他将定义你游戏的各种行为和规则.这个教程将介绍JavaScript的基本使用.1.目标 在Unity中,脚本是用来界定用户在游戏中的行为或规则.Unity推荐使用的编程语言是JavaScript,同时也支持C#或Boo. 2.前提本教程的重点是Unity脚本基

【转】Unity3D中Layers和LayerMask解析

Unity中是用int32来表示32个Layer层.int32表示二进制一共有32位(0-31).在Unity中可编辑的Layer如下图所示: 在Unity中每个GameObject都有Layer属性,默认的Layer都是Default.在Unity中可编辑的Layer共有24个(8-31层),官方已使用的是0-7层,默认不可编辑! LayerMask实际上是一个位码操作,在Unity3D中一共有32个Layer层,并且不可增加. 位运算符 按位运算符:~.|.&.^.位运算符主要用来对二进制位

Unity3D中的线性插值Lerp()函数解析

转自:http://www.aichengxu.com/view/2446604 在unity3D中经常用线性插值函数Lerp()来在两者之间插值,两者之间可以是两个材质之间.两个向量之间.两个浮点数之间.两个颜色之间,其函数原型如下: 1.Material.Lerp 插值 function Lerp(start : Material, end : Material, t : float) : void 在两个材质之间插值 2.Vector2.Lerp 插值 static functionLer