当前位置: 首页 > 知识库问答 >
问题:

更新RuntimeAnimatorController后,游戏对象的变换发生错误

西门品
2023-03-14

在Unity中,一个gameObject有NavMeshAgent和Animator组件。

在运行时,我在名为“changeAnimatorController”的函数中以以下方式更改Animator组件的RuntimeAnimatorControl:(语言-C#)

RuntimeAnimatorController newAnimController = Resources.Load("AnimControllers/WalkAnimatorController") as RuntimeAnimatorController;
void changeAnimatorController()
{
  this.gameObject.GetComponent<Animator>().runtimeAnimatorController = 
newAnimController  ;
}

现在,调用此函数的工作方式与以下两种不同:1.如果我直接从脚本调用函数“changeAnimatorController”,我的Animator控制器将更新为新的,但游戏对象的位置将更改为游戏开始前游戏对象的原始位置,并且在下一帧中被更新到正确的位置。

例如,在游戏开始之前,我的游戏对象位于位置(0,0,0)。游戏开始后,在特定时间,我的游戏对象通过动画移动到(10,0,0)。现在,如果我调用函数“changeAnimatorController”,游戏对象的位置将更改为(0,0,0),但在下一帧中再次更新为(10,0,1)。

2.If我从当前动画控制器(我要替换)中出现的动画剪辑事件中调用函数“change eAnimatorController”,gameObject的位置正在更改为游戏开始前gameObject的原始位置,并且永远不会在任何帧中更新到正确的值。

例如,在游戏开始之前,我的gameObject位于位置(0,0,0)。游戏开始后,在特定时间,我的gameObject通过动画移动到(10,0,0)。现在,如果我从动画剪辑的事件中调用函数“ChangeAnimatorController”,gameObject的位置将变为(0,0,0)并且永远不会回到(10,0,0)。但令我惊讶的是,如果gameObject的navMeshAgent的base Offset在以下方式运行更新TimeAnimatorController后立即更新为某个值,它的位置将更新为正确的值((10,0,0)在上面的示例中)。

void changeAnimatorController()
{
  this.gameObject.GetComponent<Animator>().runtimeAnimatorController = newAnimController  ;
  this.gameObject.GetComponent<NavMeshAgent>().baseOffset = requiredBaseOffset;
}

在上述所有情况下,在改变游戏对象的RunTimeAnimatorController后,游戏对象的旋转将被改变为游戏开始前游戏对象的原始旋转。比如游戏开始前,我的gameObject的旋转是(0,0,0)。游戏开始后,在一个特定的时间,我的游戏对象的旋转是(120,0,0)通过动画。现在,如果我调用函数' changeAnimatorController ',游戏对象的旋转将变为(0,0,0),并且永远不会回到(120,0,0)。

你知道为什么会以这种方式发生吗?为什么从不同位置调用函数“更改动画器控制器”的工作方式不同?在运行时更改动画模拟器的运行时间动画控制器的正确方法是什么?

共有1个答案

甄华清
2023-03-14

它It’已经决定了。这是Unity以前版本中的一个bug,但在2017.x中没有。Unity 2017.x的一切都很好。

 类似资料:
  • 将一个旧项目上的Gradle更新为最新版本,我收到以下错误:。gradle\caches\transforms-1\files-1.1\CreditCardEntry-1.4.8.10。aar\453339e1f1fb2382e8ce2362a0acdedd\res\values\values。xml:11:5-54:AAPT:error:内部元素必须是资源引用或为空。 我不明白为什么会出现这个错

  • 游戏对象的内容: 数据库原则上在游戏过程中是不会被写入的,而针对地图上人物的走动等等情况,发生变化的是游戏对象。 在Scene_Title脚本中,会生成各种游戏对象,比如command_new_game的方法就是其中的一个,这个方法是在选择了标题画面中的[新的游戏]的时候被运行的。 # 生成各种游戏对象 $game_temp = Game_Temp.new $game_system = Game_

  • GameObjects are containers for all other Components. All objects in your game are inherently GameObjects. 游戏对象是所有其他组件的容器。在你的游戏中的所有物体都是游戏对象。 An empty GameObject 一个空的游戏对象 Creating GameObjects 创建游戏对象 Gam

  • GameObjects are the most important objects in Unity. It is very important to understand what a GameObject is, and how it can be used. This page will explain all that for you. 游戏对象是Unity最重要的对象,这对于了解什么是

  • 我正在做一个多人游戏。每个客户端都有一个在共享环境中移动的字符。 我使用socket.io创建rooms,使用peer.js创建客户端之间的点对点连接。 我正在尝试做的是使每个客户端能够更新他的地图中其他玩家的角色的位置。 为此,每个客户端应该拥有其他玩家的键盘光标(箭头键)的状态,以便他能够用行走动画移动他们对应的角色。 p2p:我正在考虑在客户端之间创建双工流,这样每个客户端将拥有其他玩家的键

  • 我试图创建象棋游戏,所以我为象棋工具创建抽象类(皇后,国王,车...)我还创建了king工具来检查我的代码: 并创建game_board类: 问题是,当我尝试向矩阵添加对象时,它的show me错误:1 IntelliSense:不允许抽象类类型“King”的对象:纯虚函数“chess_tool::legal_movement”没有覆盖器 ....