private async void Start() { if (placement.formationNumber < MltdSimulationConstants.MinDanceFormation || placement.formationNumber > MltdSimulationConstants.MaxDanceFormation) { Debug.LogError($"Invalid formation number: {placement.formationNumber}, should be {MltdSimulationConstants.MinDanceFormation} to {MltdSimulationConstants.MaxDanceFormation}."); return; } var loaded = await modelLoader.LoadAndInstantiateAsync(); loaded.Body.name = GetIdolObjectName(placement.formationNumber); var modelAnimator = loaded.Body.GetComponent <Animator>(); Debug.Assert(modelAnimator != null); modelAnimator.keepAnimatorControllerStateOnDisable = false; var controller = await danceLoader.LoadAsync(); modelAnimator.runtimeAnimatorController = controller; // Remember to set this flag otherwise there will be some flickering when switching target idols modelAnimator.cullingMode = AnimatorCullingMode.AlwaysAnimate; modelAnimator.enabled = false; _modelRoot = loaded.Body; _animatorController = controller; _modelAnimator = modelAnimator; { var face = loaded.Head.transform.Find("obj_head_GP/face").gameObject; var meshRenderer = face.GetComponent <SkinnedMeshRenderer>(); facialAnimator.faceRenderer = meshRenderer; } }