using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using PuppetFace; [System.Serializable] public class PoseControllerAvailablePoses { [Header("Body")] public List BodyPosesAnimationNames; public List BodyPosesNames; [Header("Face")] public List FacePosesAnimationNames; public List FacePosesNames; [Header("Head")] public Transform HeadLookAt; public float HeadUpDownMin; public float HeadUpDownMax; public float HeadLeftRightMin; public float HeadLeftRightMax; [Header("Eyes")] public float EyesUpDownMin; public float EyesUpDownMax; public float EyesLeftRightMin; public float EyesLeftRightMax; } [System.Serializable] public class PoseControllerAvailableCharacters { public GameObject PlayerPosingCharacter; public Animator PlayerPosingCharacterAnimator; public List PlayerActiveSkinnedMeshes = new List(); public GameObject MedeaPosingCharacter; public Animator MedeaPosingCharacterAnimator; public List MedeaActiveSkinnedMeshes = new List(); } public class PoseManager : MonoBehaviour { public Quaternion temporarilySavedPlayerRot; public Vector3 temporarilySavedPlayerPos; private SkinnedMeshRenderer[] _currentCharacterSkinnedMeshes; private SkinnedMeshRenderer[] _companionSkinnedMeshes; private MeshRenderer[] _butterflyMeshRenderers; public bool _currentlySelectedCharacterIsHidden; public bool _companionIsHidden; private GameObject previousSelectedCharacter; private Animator previousSelectetCharacterAnimator; public List previousSelectedCharacterActiveSkinnedMeshes = new List(); public GameObject currentCharacter; public Animator currentCharacterAnimator; public int currentCharacterAnimFaceLayer; public int currentCharacterAnimBodyLayer; public List currentSelectedCharacterActiveSkinnedMeshes = new List(); public List currentCharacterBodyPosesAnimationNames; public List currentCharacterBodyPosesNames; public List currentCharacterFacePosesAnimationNames; public List currentCharacterFacePosesNames; public Transform currentCharacterHeadLookAt; public float currentCharacterHeadUpDownMin; public float currentCharacterHeadUpDownMax; public float currentCharacterHeadLeftRightMin; public float currentCharacterHeadLeftRightMax; public float currentCharacterEyesUpDownMin; public float currentCharacterEyesUpDownMax; public float currentCharacterEyesLeftRightMin; public float currentCharacterEyesLeftRightMax; [SerializeField] private TextMeshProUGUI _bodyPoseName; [SerializeField] private TextMeshProUGUI _facePoseName; [SerializeField] private TextMeshProUGUI _outfitName; [SerializeField] private GameObject _outfitChangePanel; [SerializeField] private AvatarMask avatarmaskBodyPart; [SerializeField] private int _indexPoses = 0; [SerializeField] private int _bodyPose = 1; [SerializeField] private int _indexFaces = 0; [SerializeField] private int _facePose = 1; [SerializeField] private int _indexOutfits = 0; [SerializeField] private int _Outftis = 1; public List time; public List nameHash; public List animationName; [Header("Butterfly Pose Values")] [SerializeField] private GameObject _butterflyObj; [SerializeField] private Transform _ChloeFinger; [SerializeField] private Transform _MaxFinger; private HairFront hairFrontDynamicBone; private bool _butterflyPose; [Header("Max's Face Material")] private Renderer _faceRenderer; private EyeMotion _eyeMotion; [HideInInspector] public bool eyesMotionON; //[SerializeField] private Renderer _MaxsfaceRenderer; //[SerializeField] private Renderer _ChloesfaceRenderer; //[SerializeField] private EyeMotion _MaxsEyeMotion; //[SerializeField] private EyeMotion _ChloesEyeMotion; private float crySmoothnessDefaultValue; private float nosebleedSmoothnessDefaultValue; private float _headUpDownDefaultValue; private float _headLeftRightDefaultValue; private float _eyesUpDownDefaultValue; private float _eyesLeftRightDefaultValue; [Header("Eyes Motion Min/Max Values")] [Header("Max")] [SerializeField] private float _MaxEyesUpDownMinValue = 0f; [SerializeField] private float _MaxEyesUpDownMaxValue = 100f; [SerializeField] private float _MaxEyesLeftRightMinValue = -100f; [SerializeField] private float _MaxEyesLeftRightMaxValue = 0f; [Header("Chloe")] [SerializeField] private float _ChloeEyesUpDownMinValue = -60f; [SerializeField] private float _ChloeEyesUpDownMaxValue = 10f; [SerializeField] private float _ChloeEyesLeftRightMinValue = -60f; [SerializeField] private float _ChloeEyesLeftRightMaxValue = 60f; //[Header("Replace Character Models")] //[SerializeField] private ReplaceCharacterModel _MaxReplaceCharacterModel; //[SerializeField] private ReplaceCharacterModel _ChloeReplaceCharacterModel; //[SerializeField] private ReplaceCharacterModel _replaceCharacterModel; float speedPercentSavedValue; public PoseControllerAvailableCharacters poseControllerAvailableCharacters; public PoseControllerAvailablePoses poseControllerAvailablePosesForPlayer; public PoseControllerAvailablePoses poseControllerAvailablePosesForMedea; private int _indexBodyPose = 0; private int _indexFacePose = 0; private static PoseManager _instance; public static PoseManager Getinstance() { return _instance; } public void Awake() { if (!_instance) { _instance = this; } _butterflyObj.SetActive(false); for (int i = 0; i < 3; i++) { time.Add(i); nameHash.Add(i); animationName.Add(""); } } private void Start() { poseControllerAvailableCharacters.PlayerPosingCharacter = PlayerManager.GetInstance().playerGameObj; poseControllerAvailableCharacters.PlayerPosingCharacterAnimator = PlayerManager.GetInstance()._PlayerMovement._CharacterAnimator; currentCharacter = poseControllerAvailableCharacters.PlayerPosingCharacter; currentCharacterAnimator = poseControllerAvailableCharacters.PlayerPosingCharacterAnimator; currentSelectedCharacterActiveSkinnedMeshes = poseControllerAvailableCharacters.PlayerActiveSkinnedMeshes; foreach (var skinnedMesh in currentCharacter.GetComponentsInChildren()) { if (skinnedMesh.enabled) // Ελέγχουμε αν είναι ενεργό { poseControllerAvailableCharacters.PlayerActiveSkinnedMeshes.Add(skinnedMesh); // Το προσθέτουμε στη λίστα } } currentCharacterBodyPosesAnimationNames = new List(poseControllerAvailablePosesForPlayer.BodyPosesAnimationNames); currentCharacterBodyPosesNames = new List(poseControllerAvailablePosesForPlayer.BodyPosesNames); currentCharacterFacePosesAnimationNames = new List(poseControllerAvailablePosesForPlayer.FacePosesAnimationNames); currentCharacterFacePosesNames = new List(poseControllerAvailablePosesForPlayer.FacePosesNames); previousSelectedCharacter = currentCharacter; previousSelectetCharacterAnimator = currentCharacterAnimator; previousSelectedCharacterActiveSkinnedMeshes = currentSelectedCharacterActiveSkinnedMeshes; } void OnValidate() { #if UNITY_EDITOR if (!Application.isPlaying) { //if (PlayersManager.GetInstance()._MaxReplaceCharacterModel == null) //{ // PlayersManager.GetInstance()._MaxReplaceCharacterModel = GameObject.Find("ReplaceCharacterModel (Max)").GetComponent(); // #region Max finger set up // #endregion //} //if (PlayersManager.GetInstance()._ChloeReplaceCharacterModel == null) //{ // PlayersManager.GetInstance()._ChloeReplaceCharacterModel = GameObject.Find("ReplaceCharacterModel (Chloe)").GetComponent(); // #region Chloe finger set up // #endregion // print("Character Models Replace is set"); //} //if (PlayersManager.GetInstance().MaxReplaceCharacterModel != null) //{ // #region Max finger set up // _MaxFinger = PlayersManager.GetInstance().MaxReplaceCharacterModel.characterBase.transform.Find // ("CharacterModelPivot/" + PlayersManager.GetInstance().MaxReplaceCharacterModel.characterModelName // + "/Reference/Hips/Spine/Spine1/Spine2/RightShoulder/RightArm/RightArmRoll/RightForearm/RightForearmRoll/RightHand/RightHandIndex1/RightHandIndex2").transform; // #endregion //} //if (PlayersManager.GetInstance().ChloeReplaceCharacterModel != null) //{ // #region Chloe finger set up // _ChloeFinger = PlayersManager.GetInstance().ChloeReplaceCharacterModel.characterBase.transform.Find // ("CharacterModelPivot/" + PlayersManager.GetInstance().ChloeReplaceCharacterModel.characterModelName // + "/Reference/Hips/Spine/Spine1/Spine2/RightShoulder/RightArm/RightArmRoll/RightForearm/RightForearmRoll/RightHand/RightHandIndex1/RightHandIndex2").transform; // #endregion //} } #endif } public void SetCharacterFingers() { //if (PlayersManager.GetInstance().ChloeIsPlaying) //{ // _ChloeFinger = PlayersManager.GetInstance().ChloeReplaceCharacterModel.characterBase.transform.Find("CharacterModelPivot/" + PlayersManager.GetInstance().ChloeReplaceCharacterModel.characterModelName + // "/Reference/Hips/Spine/Spine1/Spine2/RightShoulder/RightArm/RightArmRoll/RightForearm/RightForearmRoll/RightHand/RightHandIndex1/RightHandIndex2").transform; //} //else //{ // _MaxFinger = PlayersManager.GetInstance().MaxReplaceCharacterModel.characterBase.transform.Find("CharacterModelPivot/" + PlayersManager.GetInstance().MaxReplaceCharacterModel.characterModelName + // "/Reference/Hips/Spine/Spine1/Spine2/RightShoulder/RightArm/RightArmRoll/RightForearm/RightForearmRoll/RightHand/RightHandIndex1/RightHandIndex2").transform; //} } private IEnumerator GetHairFront() { //hairFrontDynamicBone = PlayersManager.GetInstance()._playerGameObject.GetComponentInChildren(); //hairFrontDynamicBone.hairFrontDynamicBone.enabled = false; yield return new WaitForSecondsRealtime(0.1f); //hairFrontDynamicBone.hairFrontDynamicBone.enabled = true; } public void EyesMotionON() { PhotomodeManager.GetInstance()._eyesUpDownSlider.interactable = true; PhotomodeManager.GetInstance()._eyesLeftRightSlider.interactable = true; if (_eyeMotion != null) { _eyeMotion.enabled = true; } //Check UI: PhotomodeManager.GetInstance().EyesControlONCheckUI.SetActive(true); PhotomodeManager.GetInstance().EyesControlOFFCheckUI.SetActive(false); if (_eyeMotion != null) { eyesMotionON = true; } } public void EyesMotionOFF() { PhotomodeManager.GetInstance()._eyesUpDownSlider.interactable = false; PhotomodeManager.GetInstance()._eyesLeftRightSlider.interactable = false; if (_eyeMotion != null) { _eyeMotion.enabled = false; } //Check UI: PhotomodeManager.GetInstance().EyesControlONCheckUI.SetActive(false); PhotomodeManager.GetInstance().EyesControlOFFCheckUI.SetActive(true); if (_eyeMotion != null) { eyesMotionON = false; } } public void UpdateFaceRendererValues() { if (currentCharacter.TryGetComponent(out var faceRenderer)) { _faceRenderer = faceRenderer.faceRenderer; } else { Debug.LogWarning("FaceRenderer component not found on " + currentCharacter.name); } if (currentCharacterHeadLookAt != null) { PhotomodeManager.GetInstance()._headUpDownSlider.minValue = currentCharacterHeadUpDownMin; PhotomodeManager.GetInstance()._headUpDownSlider.maxValue = currentCharacterHeadUpDownMax; PhotomodeManager.GetInstance()._headLeftRightSlider.minValue = currentCharacterHeadLeftRightMin; PhotomodeManager.GetInstance()._headLeftRightSlider.maxValue = currentCharacterHeadLeftRightMax; } _eyeMotion = currentCharacter.GetComponentInChildren(); if (_eyeMotion == null) { Debug.LogWarning("EyeMotion component not found in children of " + currentCharacter.name); } //PlayersManager.GetInstance().replaceCharacterModel = PlayersManager.GetInstance().MaxReplaceCharacterModel; PhotomodeManager.GetInstance()._eyesUpDownSlider.minValue = currentCharacterEyesUpDownMin; PhotomodeManager.GetInstance()._eyesUpDownSlider.maxValue = currentCharacterEyesUpDownMax; PhotomodeManager.GetInstance()._eyesLeftRightSlider.minValue = currentCharacterEyesLeftRightMin; PhotomodeManager.GetInstance()._eyesLeftRightSlider.maxValue = currentCharacterEyesLeftRightMax; } public void Cry_NoseBleed_SmoothnessDefaultValues() { //if(_faceRenderer!=null) //crySmoothnessDefaultValue = _faceRenderer.material.GetFloat("_CrySmoothness_1"); //nosebleedSmoothnessDefaultValue = _faceRenderer.material.GetFloat("_NoseBleedSmoothness"); if(currentCharacterHeadLookAt!=null) _headUpDownDefaultValue = currentCharacterHeadLookAt.localPosition.y; _headLeftRightDefaultValue = currentCharacterHeadLookAt.localPosition.x; PhotomodeManager.GetInstance()._headUpDownSlider.value = _headUpDownDefaultValue; PhotomodeManager.GetInstance()._headLeftRightSlider.value = _headLeftRightDefaultValue; } public void EyeMotionDefaultValues() { _eyesUpDownDefaultValue = _eyeMotion.LookAtTarget.localPosition.y; _eyesLeftRightDefaultValue = _eyeMotion.LookAtTarget.localPosition.x; PhotomodeManager.GetInstance()._eyesUpDownSlider.value = _eyesUpDownDefaultValue; PhotomodeManager.GetInstance()._eyesLeftRightSlider.value = _eyesLeftRightDefaultValue; } public void UpdateFaceRenderer() { //if (_faceRenderer != null) //{ // _faceRenderer.material.SetFloat("_CrySmoothness_1", PhotomodeManager.GetInstance()._headUpDownSlider.value); // _faceRenderer.material.SetFloat("_NoseBleedSmoothness", PhotomodeManager.GetInstance()._headLeftRightSlider.value); //} if(currentCharacterHeadLookAt != null) { currentCharacterHeadLookAt.transform.localPosition = new Vector3(PhotomodeManager.GetInstance()._headLeftRightSlider.value, PhotomodeManager.GetInstance()._headUpDownSlider.value, currentCharacterHeadLookAt.localPosition.z); } if (_eyeMotion != null) { _eyeMotion.LookAtTarget.localPosition = new Vector3(_eyeMotion.LookAtTarget.localPosition.x, PhotomodeManager.GetInstance()._eyesUpDownSlider.value, PhotomodeManager.GetInstance()._eyesLeftRightSlider.value); } } #region Hide & Show Player public void HideCharacter() { _currentCharacterSkinnedMeshes = currentCharacter.GetComponentsInChildren(); foreach (SkinnedMeshRenderer currentCharacterSkinnedMeshes in _currentCharacterSkinnedMeshes) { currentCharacterSkinnedMeshes.enabled = false; } _currentlySelectedCharacterIsHidden = true; #region Butterfly Mesh Renderers _butterflyMeshRenderers = _butterflyObj.GetComponentsInChildren(); foreach (MeshRenderer _butterflySkinnedMeshes in _butterflyMeshRenderers) { _butterflySkinnedMeshes.enabled = false; } #endregion } public void DisplayCharacter() { _currentCharacterSkinnedMeshes = currentCharacter.GetComponentsInChildren(); foreach (SkinnedMeshRenderer _playerSkinnedMeshes in _currentCharacterSkinnedMeshes) { _playerSkinnedMeshes.enabled = true; } _currentlySelectedCharacterIsHidden = false; #region Butterfly Mesh Renderers _butterflyMeshRenderers = _butterflyObj.GetComponentsInChildren(); foreach (MeshRenderer _butterflySkinnedMeshes in _butterflyMeshRenderers) { _butterflySkinnedMeshes.enabled = true; } #endregion } #endregion #region Hide & Show Companion public void HideCompanion() { if (MedeaDemonicEnemyBehaviour.GetInstance() != null) { _companionSkinnedMeshes = MedeaDemonicEnemyBehaviour.GetInstance()._medeaSkinnedMeshRenderer.ToArray(); foreach (SkinnedMeshRenderer _companionSkinnedMeshes in _companionSkinnedMeshes) { _companionSkinnedMeshes.enabled = false; } _companionIsHidden = true; } } public void DisplayCompanion() { if (MedeaDemonicEnemyBehaviour.GetInstance() != null) { _companionSkinnedMeshes = MedeaDemonicEnemyBehaviour.GetInstance()._medeaSkinnedMeshRenderer.ToArray(); foreach (SkinnedMeshRenderer _companionSkinnedMeshes in _companionSkinnedMeshes) { _companionSkinnedMeshes.enabled = true; } _companionIsHidden = false; } } #endregion public void SaveAnimatorStateAndAnimationFrame() { time[0] = PlayerManager.GetInstance()._PlayerMovement._CharacterAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime; //Saves the frames of the animation. nameHash[0] = PlayerManager.GetInstance()._PlayerMovement._CharacterAnimator.GetCurrentAnimatorStateInfo(0).nameHash; //Saves the current state of the animator. time[1] = GetCurrentAnimatorTime(PlayerManager.GetInstance()._PlayerMovement._CharacterAnimator, 1); //Saves the frames of the animation. nameHash[1] = PlayerManager.GetInstance()._PlayerMovement._CharacterAnimator.GetCurrentAnimatorStateInfo(1).nameHash; //Saves the current state of the animator. time[2] = GetCurrentAnimatorTime(PlayerManager.GetInstance()._PlayerMovement._CharacterAnimator, 2); //Saves the frames of the animation. nameHash[2] = PlayerManager.GetInstance()._PlayerMovement._CharacterAnimator.GetCurrentAnimatorStateInfo(2).nameHash; //Saves the current state of the animator. speedPercentSavedValue = PlayerManager.GetInstance()._PlayerMovement._CharacterAnimator.GetFloat("speedPercent"); } public float GetCurrentAnimatorTime(Animator targetAnim, int layer = 0) { AnimatorStateInfo animState = targetAnim.GetCurrentAnimatorStateInfo(layer); float currentTime = animState.normalizedTime; return currentTime; } public string GetCurrentClipName(Animator targetAnim, int layer = 0) { AnimatorStateInfo animState = targetAnim.GetCurrentAnimatorStateInfo(layer); string name = animState.nameHash.ToString(); return name; } #region Player Body public enum PlayerBody { Game, MiddleFingers, Dancing, ReverseTime, ThumbsUp, FoldedArms, ButterflyInHand } public PlayerBody bodyState = PlayerBody.Game; public void PlayerBodyUpdate() { if (currentCharacterBodyPosesAnimationNames.Count == 0) return; _indexBodyPose = Mathf.Clamp(_indexBodyPose, 0, currentCharacterBodyPosesAnimationNames.Count - 1); if (_indexBodyPose == 0) // Game animation { print("Game animation"); PlayerManager.GetInstance()._PlayerMovement._CharacterAnimator.Play(nameHash[0], 0, time[0]); PlayerManager.GetInstance()._PlayerMovement._CharacterAnimator.Play(nameHash[1], 1, time[1]); PlayerManager.GetInstance()._PlayerMovement._CharacterAnimator.Play(nameHash[2], 2, time[2]); PlayerManager.GetInstance()._PlayerMovement._CharacterAnimator.Play("None", 3); PlayerManager.GetInstance()._PlayerMovement._CharacterAnimator.SetFloat("speedPercent", speedPercentSavedValue); PoseLookAt.GetInstance()._neckGameRot = PoseLookAt.GetInstance()._neck.rotation; UpdatePlayerBodyLookAt_Game(); _bodyPoseName.text = "Game"; if (currentCharacter != poseControllerAvailableCharacters.PlayerPosingCharacter) { currentCharacterAnimator.Play("None", currentCharacterAnimBodyLayer); } } else { string animationName = currentCharacterBodyPosesAnimationNames[_indexBodyPose]; currentCharacterAnimator.Play(animationName, currentCharacterAnimBodyLayer); _bodyPoseName.text = currentCharacterBodyPosesNames[_indexBodyPose]; } } #region Butterfly Pose Related IEnumerator UpdateButterflyPose() { yield return new WaitForSecondsRealtime(0.01f); //if (PlayersManager.GetInstance().ChloeIsPlaying) //{ // _butterflyObj.SetActive(true); // _butterflyObj.transform.position = _ChloeFinger.position; // _butterflyObj.transform.rotation = _ChloeFinger.rotation; //} //else //{ // _butterflyObj.SetActive(true); // _butterflyObj.transform.position = _MaxFinger.position; // _butterflyObj.transform.rotation = _MaxFinger.rotation; //} } public void ButterflyObjIsDisabled() { _butterflyObj.SetActive(false); } #endregion public void NextBodyPose() { if (currentCharacterBodyPosesAnimationNames.Count == 0) return; _indexBodyPose = (_indexBodyPose + 1) % currentCharacterBodyPosesAnimationNames.Count; PlayerBodyUpdate(); } public void PreviousBodyPose() { if (currentCharacterBodyPosesAnimationNames.Count == 0) return; _indexBodyPose = (_indexBodyPose - 1 + currentCharacterBodyPosesAnimationNames.Count) % currentCharacterBodyPosesAnimationNames.Count; PlayerBodyUpdate(); } #region Update PoseLookAt. public void UpdatePlayerBodyLookAt_Game() { PoseLookAt.GetInstance()._lookAt.localEulerAngles = new Vector3(PoseLookAt.GetInstance()._neckGameRot.x, PoseLookAt.GetInstance()._neckGameRot.y, PoseLookAt.GetInstance()._neckGameRot.z); } public void UpdatePlayerBodyLookAt_MiddleFingers() { PoseLookAt.GetInstance()._lookAt.localEulerAngles = new Vector3(-0.28f, -0.821f, -4.132f); } public void UpdatePlayerBodyLookAt_Dancing() { PoseLookAt.GetInstance()._lookAt.localEulerAngles = new Vector3(22.75675f, 315.1279f, 3.121685f); } public void UpdatePlayerBodyLookAt_ReverseTime() { PoseLookAt.GetInstance()._lookAt.localEulerAngles = new Vector3(4.686f, 25.758f, -13.544f); } public void UpdatePlayerBodyLookAt_ThumbsUp() { PoseLookAt.GetInstance()._lookAt.localEulerAngles = new Vector3(3.645f, 15.321f, -6.409f); } public void UpdatePlayerBodyLookAt_FoldedArms() { PoseLookAt.GetInstance()._lookAt.localEulerAngles = new Vector3(4.704f, 22.423f, -0.15f); } public void UpdatePlayerBodyLookAt_ButterflyAtHand() { PoseLookAt.GetInstance()._lookAt.localEulerAngles = new Vector3(16.37787f, 350.2041f, 3.878617f); } #endregion public void PlayerBodyPoseReset() { bodyState = PlayerBody.Game; PlayerBodyUpdate(); _indexPoses = 0; _bodyPose = 1; } #endregion #region Player Face public enum PlayerFace { Game, Angry, Happy, Sad, Smiling, Silly, Disgusted, Wondermend, Annoyed } public PlayerFace faceState = PlayerFace.Game; public void PlayerFaceUpdate() { if (currentCharacterFacePosesAnimationNames.Count == 0) return; _indexFacePose = Mathf.Clamp(_indexFacePose, 0, currentCharacterFacePosesAnimationNames.Count - 1); string animationName = currentCharacterFacePosesAnimationNames[_indexFacePose]; currentCharacterAnimator.Play(animationName, currentCharacterAnimFaceLayer); _facePoseName.text = currentCharacterFacePosesNames[_indexFacePose]; } public enum CharacterModel { Player, Medea, DarkRoom } public CharacterModel SelectedCharacterModelState = CharacterModel.Player; public void NextFacePose() { if (currentCharacterFacePosesAnimationNames.Count == 0) return; _indexFacePose = (_indexFacePose + 1) % currentCharacterFacePosesAnimationNames.Count; PlayerFaceUpdate(); } public void PreviousFacePose() { if (currentCharacterFacePosesAnimationNames.Count == 0) return; _indexFacePose = (_indexFacePose - 1 + currentCharacterFacePosesAnimationNames.Count) % currentCharacterFacePosesAnimationNames.Count; PlayerFaceUpdate(); } #endregion public void ChangePlayerOutfit() { //if (PlayersManager.GetInstance().ChloeIsPlaying) //{ // //Chloe blah blah... // _outfitName.text = "Jacket & Beanie"; //Placeholder //} //else //{ switch (SelectedCharacterModelState) { case CharacterModel.Player: _outfitName.text = "Player"; UpdateCharacterModels(poseControllerAvailableCharacters.PlayerPosingCharacter, poseControllerAvailableCharacters.PlayerPosingCharacterAnimator, poseControllerAvailableCharacters.MedeaActiveSkinnedMeshes, poseControllerAvailableCharacters.PlayerActiveSkinnedMeshes,5,1,poseControllerAvailablePosesForPlayer); break; case CharacterModel.Medea: _outfitName.text = "Medea"; UpdateCharacterModels(poseControllerAvailableCharacters.MedeaPosingCharacter, poseControllerAvailableCharacters.MedeaPosingCharacterAnimator, poseControllerAvailableCharacters.PlayerActiveSkinnedMeshes, poseControllerAvailableCharacters.MedeaActiveSkinnedMeshes,1,2,poseControllerAvailablePosesForMedea); break; case CharacterModel.DarkRoom: //PlayersManager.GetInstance().replaceCharacterModel.modelID = 2; //Destroy(PlayersManager.GetInstance().replaceCharacterModel.currentCharacterModel); //PlayersManager.GetInstance().replaceCharacterModel.InstansiateNewModel(); _outfitName.text = "PLACEHOLDER"; UpdateCharacterModels(poseControllerAvailableCharacters.MedeaPosingCharacter, poseControllerAvailableCharacters.MedeaPosingCharacterAnimator, poseControllerAvailableCharacters.MedeaActiveSkinnedMeshes, poseControllerAvailableCharacters.PlayerActiveSkinnedMeshes,1,2, poseControllerAvailablePosesForMedea); break; default: break; //} } } public void PreviousOutfit() { #region Previous outfit _indexOutfits--; if (_indexOutfits < 1) // Αν πέσει κάτω από 1, πήγαινε στο 3 { _indexOutfits = 3; } _Outftis = _indexOutfits; switch (_Outftis) { case 1: SelectedCharacterModelState = CharacterModel.Player; break; case 2: SelectedCharacterModelState = CharacterModel.Medea; break; case 3: SelectedCharacterModelState = CharacterModel.DarkRoom; break; } ChangePlayerOutfit(); #endregion } public void NextOutfit() { #region Next outfit _indexOutfits++; if (_indexOutfits > 3) // Αν περάσει το 3, πήγαινε στο 1 { _indexOutfits = 1; } _Outftis = _indexOutfits; switch (_Outftis) { case 1: SelectedCharacterModelState = CharacterModel.Player; break; case 2: SelectedCharacterModelState = CharacterModel.Medea; break; case 3: SelectedCharacterModelState = CharacterModel.DarkRoom; break; } ChangePlayerOutfit(); #endregion } public void UpdateCharacterModels(GameObject newCharacterGo, Animator newCharacterAnimator, List ModelSkinnedMeshesToDisable, List ModelSkinnedMeshesToEnable, int faceAnimLayer, int bodyAnimLayer, PoseControllerAvailablePoses poseControllerAvailablePoses) { previousSelectedCharacter = currentCharacter; previousSelectetCharacterAnimator = currentCharacterAnimator; if (previousSelectedCharacter != poseControllerAvailableCharacters.PlayerPosingCharacter) { previousSelectedCharacter.gameObject.SetActive(false); } currentCharacter = newCharacterGo; currentCharacter.gameObject.SetActive(true); currentCharacterAnimator = newCharacterAnimator; currentCharacter.transform.position = temporarilySavedPlayerPos; currentCharacter.transform.rotation = temporarilySavedPlayerRot; currentCharacterAnimFaceLayer = faceAnimLayer; currentCharacterAnimBodyLayer = bodyAnimLayer; UpdateCharacterModelSkinnedMeshes(ModelSkinnedMeshesToDisable, ModelSkinnedMeshesToEnable); currentCharacterBodyPosesAnimationNames = new List(poseControllerAvailablePoses.BodyPosesAnimationNames); currentCharacterBodyPosesNames = new List(poseControllerAvailablePoses.BodyPosesNames); currentCharacterFacePosesAnimationNames = new List(poseControllerAvailablePoses.FacePosesAnimationNames); currentCharacterFacePosesNames = new List(poseControllerAvailablePoses.FacePosesNames); currentCharacterHeadLookAt = poseControllerAvailablePoses.HeadLookAt; currentCharacterHeadUpDownMin = poseControllerAvailablePoses.HeadUpDownMin; currentCharacterHeadUpDownMax = poseControllerAvailablePoses.HeadUpDownMax; currentCharacterHeadLeftRightMin = poseControllerAvailablePoses.HeadLeftRightMin; currentCharacterHeadLeftRightMax = poseControllerAvailablePoses.HeadLeftRightMax; currentCharacterEyesUpDownMin = poseControllerAvailablePoses.EyesUpDownMin; currentCharacterEyesUpDownMax = poseControllerAvailablePoses.EyesUpDownMax; currentCharacterEyesLeftRightMin = poseControllerAvailablePoses.EyesLeftRightMin; currentCharacterEyesLeftRightMax = poseControllerAvailablePoses.EyesLeftRightMax; PoseLookAt.GetInstance().ValuesUpdate(); UpdateFaceRendererValues(); StartCoroutine(ResetPlayerGameAnimAfterModelSwap()); } public void UpdateCharacterModelSkinnedMeshes(List ModelSkinnedMeshesToDisable, List ModelSkinnedMeshesToEnable) { foreach (var skinnedMesh in ModelSkinnedMeshesToDisable) { skinnedMesh.enabled = false; // Το απενεργοποιούμε } foreach (var skinnedMesh in ModelSkinnedMeshesToEnable) { skinnedMesh.enabled = true; // Το ενεργοποιούμε } } IEnumerator ResetPlayerGameAnimAfterModelSwap() { _outfitChangePanel.SetActive(true); yield return new WaitForSecondsRealtime(0.001f); PoseLookAt.GetInstance().ValuesUpdate(); currentCharacterAnimator.Play(nameHash[0], 0, time[0]); currentCharacterAnimator.Play(nameHash[1], 0, time[1]); currentCharacterAnimator.Play(nameHash[2], 0, time[2]); currentCharacterAnimator.Play("None", 3); //Sets the Body Pose layer animation state to None. //if (PlayersManager.GetInstance().ChloeIsPlaying) //{ // _ChloeFinger = PlayersManager.GetInstance().ChloeReplaceCharacterModel.characterBase.transform.Find("CharacterModelPivot/" + PlayersManager.GetInstance().ChloeReplaceCharacterModel.characterModelName + // "/Reference/Hips/Spine/Spine1/Spine2/RightShoulder/RightArm/RightArmRoll/RightForearm/RightForearmRoll/RightHand/RightHandIndex1/RightHandIndex2").transform; //} //else //{ // _MaxFinger = PlayersManager.GetInstance().MaxReplaceCharacterModel.characterBase.transform.Find("CharacterModelPivot/" + PlayersManager.GetInstance().MaxReplaceCharacterModel.characterModelName + // "/Reference/Hips/Spine/Spine1/Spine2/RightShoulder/RightArm/RightArmRoll/RightForearm/RightForearmRoll/RightHand/RightHandIndex1/RightHandIndex2").transform; //} if (!_currentlySelectedCharacterIsHidden) { _currentCharacterSkinnedMeshes = currentCharacter.GetComponentsInChildren(); foreach (SkinnedMeshRenderer _playerSkinnedMeshes in _currentCharacterSkinnedMeshes) { _playerSkinnedMeshes.enabled = true; } } yield return new WaitForSecondsRealtime(0.01f); PlayerFaceUpdate(); PlayerBodyUpdate(); _outfitChangePanel.SetActive(false); } public void PlayerFacePoseReset() { faceState = PlayerFace.Game; PlayerFaceUpdate(); _indexFaces = 0; _facePose = 1; #region Face renderer effects reset //_faceRenderer.material.SetFloat("_CrySmoothness_1", crySmoothnessDefaultValue); //_faceRenderer.material.SetFloat("_NoseBleedSmoothness", nosebleedSmoothnessDefaultValue); PhotomodeManager.GetInstance()._headUpDownSlider.value = _headUpDownDefaultValue; PhotomodeManager.GetInstance()._headLeftRightSlider.value = _headLeftRightDefaultValue; PhotomodeManager.GetInstance()._eyesUpDownSlider.value = _eyesUpDownDefaultValue; PhotomodeManager.GetInstance()._eyesLeftRightSlider.value = _eyesLeftRightDefaultValue; EyesMotionOFF(); #endregion } public void PlayerOutfitReset() { SelectedCharacterModelState = CharacterModel.Player; ChangePlayerOutfit(); _indexOutfits = 0; _Outftis = 1; } public void PoseManagerReset() { DisplayCharacter(); DisplayCompanion(); PlayerBodyPoseReset(); PlayerFacePoseReset(); PlayerOutfitReset(); } }