866 lines
35 KiB
C#
866 lines
35 KiB
C#
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using TMPro;
|
||
using UnityEngine;
|
||
using PuppetFace;
|
||
|
||
[System.Serializable]
|
||
public class PoseControllerAvailablePoses
|
||
{
|
||
[Header("Body")]
|
||
public List<string> BodyPosesAnimationNames;
|
||
public List<string> BodyPosesNames;
|
||
|
||
[Header("Face")]
|
||
public List<string> FacePosesAnimationNames;
|
||
public List<string> 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<SkinnedMeshRenderer> PlayerActiveSkinnedMeshes = new List<SkinnedMeshRenderer>();
|
||
public GameObject MedeaPosingCharacter;
|
||
public Animator MedeaPosingCharacterAnimator;
|
||
public List<SkinnedMeshRenderer> MedeaActiveSkinnedMeshes = new List<SkinnedMeshRenderer>();
|
||
}
|
||
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<SkinnedMeshRenderer> previousSelectedCharacterActiveSkinnedMeshes = new List<SkinnedMeshRenderer>();
|
||
|
||
public GameObject currentCharacter;
|
||
public Animator currentCharacterAnimator;
|
||
public int currentCharacterAnimFaceLayer;
|
||
public int currentCharacterAnimBodyLayer;
|
||
public List<SkinnedMeshRenderer> currentSelectedCharacterActiveSkinnedMeshes = new List<SkinnedMeshRenderer>();
|
||
public List<string> currentCharacterBodyPosesAnimationNames;
|
||
public List<string> currentCharacterBodyPosesNames;
|
||
public List<string> currentCharacterFacePosesAnimationNames;
|
||
public List<string> 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<float> time;
|
||
public List<int> nameHash;
|
||
public List<string> 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<SkinnedMeshRenderer>())
|
||
{
|
||
if (skinnedMesh.enabled) // Ελέγχουμε αν είναι ενεργό
|
||
{
|
||
poseControllerAvailableCharacters.PlayerActiveSkinnedMeshes.Add(skinnedMesh); // Το προσθέτουμε στη λίστα
|
||
}
|
||
}
|
||
currentCharacterBodyPosesAnimationNames = new List<string>(poseControllerAvailablePosesForPlayer.BodyPosesAnimationNames);
|
||
currentCharacterBodyPosesNames = new List<string>(poseControllerAvailablePosesForPlayer.BodyPosesNames);
|
||
|
||
currentCharacterFacePosesAnimationNames = new List<string>(poseControllerAvailablePosesForPlayer.FacePosesAnimationNames);
|
||
currentCharacterFacePosesNames = new List<string>(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<ReplaceCharacterModel>();
|
||
// #region Max finger set up
|
||
|
||
// #endregion
|
||
//}
|
||
//if (PlayersManager.GetInstance()._ChloeReplaceCharacterModel == null)
|
||
//{
|
||
// PlayersManager.GetInstance()._ChloeReplaceCharacterModel = GameObject.Find("ReplaceCharacterModel (Chloe)").GetComponent<ReplaceCharacterModel>();
|
||
// #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<HairFront>();
|
||
//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<FaceRenderer>(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<EyeMotion>();
|
||
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<SkinnedMeshRenderer>();
|
||
|
||
foreach (SkinnedMeshRenderer currentCharacterSkinnedMeshes in _currentCharacterSkinnedMeshes)
|
||
{
|
||
currentCharacterSkinnedMeshes.enabled = false;
|
||
}
|
||
_currentlySelectedCharacterIsHidden = true;
|
||
|
||
#region Butterfly Mesh Renderers
|
||
_butterflyMeshRenderers = _butterflyObj.GetComponentsInChildren<MeshRenderer>();
|
||
foreach (MeshRenderer _butterflySkinnedMeshes in _butterflyMeshRenderers)
|
||
{
|
||
_butterflySkinnedMeshes.enabled = false;
|
||
|
||
}
|
||
#endregion
|
||
}
|
||
|
||
public void DisplayCharacter()
|
||
{
|
||
_currentCharacterSkinnedMeshes = currentCharacter.GetComponentsInChildren<SkinnedMeshRenderer>();
|
||
|
||
foreach (SkinnedMeshRenderer _playerSkinnedMeshes in _currentCharacterSkinnedMeshes)
|
||
{
|
||
_playerSkinnedMeshes.enabled = true;
|
||
|
||
}
|
||
_currentlySelectedCharacterIsHidden = false;
|
||
|
||
#region Butterfly Mesh Renderers
|
||
_butterflyMeshRenderers = _butterflyObj.GetComponentsInChildren<MeshRenderer>();
|
||
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<SkinnedMeshRenderer> ModelSkinnedMeshesToDisable,
|
||
List<SkinnedMeshRenderer> 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<string>(poseControllerAvailablePoses.BodyPosesAnimationNames);
|
||
currentCharacterBodyPosesNames = new List<string>(poseControllerAvailablePoses.BodyPosesNames);
|
||
currentCharacterFacePosesAnimationNames = new List<string>(poseControllerAvailablePoses.FacePosesAnimationNames);
|
||
currentCharacterFacePosesNames = new List<string>(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<SkinnedMeshRenderer> ModelSkinnedMeshesToDisable, List<SkinnedMeshRenderer> 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<SkinnedMeshRenderer>();
|
||
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();
|
||
}
|
||
}
|