unity当角色使用characterController组件后通过transform.position设置角色位置失效的问题

问题:

角色使用characterController角色控制器组件之后,使用transform.position设置角色的位置会出现意料之外的情况


原因:

踩坑一下午研究出的简单结论(不一定正确欢迎大佬指正):

因为用了角色控制器之后,物理系统会优先接管角色位置信息,直接用position去设置的位置,和物理系统的算法不一样


解决:

土味解决方法:

在调用transform.position方法之前将角色控制器失活,移动完了再激活

player.GetComponent<CharacterController>().enabled = false;
player.transform.position = targetPos;
player.GetComponent<CharacterController>().enabled = true;

正确解决方法:

在unity官方问题反馈里,有老外提到过这个问题http://[Unity Issue Tracker - CharacterController overrides object&#39;s position when teleporting with Transform.Position (unity3d.com)](https://issuetracker.unity3d.com/issues/charactercontroller-overrides-objects-position-when-teleporting-with-transform-dot-position)结合国内大佬分析https://blog.csdn.net/a71468293a/article/details/116981240

结论(不一定正确欢迎大佬指正):

在角色移动之前,打开物理系统自动同步转换,它可以把Transform的坐标转换为物理系统算法下的坐标,这样就可以通过position正确设置角色位置了。

//启用物理系统自动同步转换
Physics.autoSyncTransforms = true;
//此时再设置角色位置就符合预期了
player.transform.position = targetPos;

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: UnityTransform.position属性表示一个物体在3D空间中的位置。可以使用transform.position来获取或设置物体的位置。 例如: transform.position = new Vector3(1, 2, 3); // 设置物体的位置为 (1, 2, 3) Vector3 pos = transform.position; // 获取物体的位置 transform.position += Vector3.up; // 将物体向上移动一个单位 注意:transform.position是在3D空间中的位置,如果要在2D空间中操作位置,可以使用transform.position.x和transform.position.y ### 回答2: Unity 中的 transform.position 属性表示了一个游戏对象在世界坐标系下的位置。这个属性可以用来获取或设置对象的位置坐标。例如: // 获取一个对象的位置坐标 Vector3 pos = transform.position; // 将一个对象的位置移动到 (1, 0, 0) 点 transform.position = new Vector3(1, 0, 0); 我们可以通过在代码中修改 transform.position 属性的值,来控制游戏对象在场景中的位置。例如,我们可以在 Update() 函数中写入下面的代码,使一个对象每帧往左移动: void Update() { transform.position += Vector3.left * Time.deltaTime; } 这里,我们使用 Vector3.left 向量表示一个向左的单位向量,在每帧更新时,将该向量与每秒的时间差(Time.deltaTime)相乘后加到 transform.position 中,即可使对象不断地往左移动。 需要注意的是,修改 transform.position 属性会导致对象在场景中的位置发生变化,而这可能会影响到该对象及其附属组件的行为。例如,如果我们将一个 RigidBody 组件附加到游戏对象上,并设置其重力为一定值,那么当我们修改该对象的 transform.position 属性时,就可能会影响到该对象受到重力的作用,出现异常行为。 除了 transform.position 属性外,Unity 中还有 transform.rotation 和 transform.localScale 属性,分别用于控制对象的旋转和缩放。它们的使用方法与 transform.position 类似,可以通过改变它们的属性值来改变对象的旋转和缩放效果。 总之,在 Unity 中,transform.position 属性是一个非常常用的属性,掌握其用法可以帮助我们更好地控制游戏对象在场景中的位置。 ### 回答3: 在Unity中,Transform是非常重要的一个组件,它代表了一个物体在场景中的位置、旋转和缩放信息。其中,Transform的一个重要属性是transform.position,指的是物体在世界坐标系中的位置。下面我们来详细解释Transform.position的用法。 首先,通过Transform.position我们可以获取到物体在世界坐标系中的位置。如果我们想要改变物体的位置,我们也可以直接操作Transform.position。比如,我们可以在脚本或者代码中使用以下方式改变对象的位置transform.position = new Vector3(0, 1, 0); 这样,就可以让物体的位置移动到世界坐标系中的(0,1,0)位置。 同时,Transform.position也提供了一些非常实用的方法。比如,我们可以使用Vector3.MoveTowards方法来让物体向某个位置移动指定的距离。这个方法的参数包括当前位置、目标位置和移动速度。例如:transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime); 这样,就可以让物体向某个目标位置移动,并且控制移动的速度。 另外,Transform.position作为一个属性,也可以被其他组件的属性进行绑定。例如,我们可以将物体的位置属性和某个Slider组件的Value属性绑定在一起,这样,当Slider的值变化时,物体的位置也会随之改变。 最后,需要注意的是,改变Transform.position属性会影响物体在场景中的全局位置,所以需要谨慎使用。如果只是想改变相对位置,可以使用Transform.Translate或者其他更加适合的方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值