using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using Random = UnityEngine.Random; public class CrowdManager : MonoBehaviour { public CitizenCrowdMember.SelectableAnimation m_currentAnimation = CitizenCrowdMember.SelectableAnimation.Afraid; private CitizenCrowdMember.SelectableAnimation m_previousFrameAnimation = CitizenCrowdMember.SelectableAnimation.Afraid; public float m_transitionTime = 1.5f; public float m_transitionTimeVariation = 0.5f; public float m_transitionStartVariation = 2f; public float m_animationSpeedVariation = 0.01f; private CitizenCrowdMember[] m_citizenList; private float m_timeSinceLastStateChange = 0f; private DateTime m_cheerEnd = DateTime.Now; private bool m_animationOnTimer = false; private CitizenCrowdMember.SelectableAnimation m_nextAnimation = CitizenCrowdMember.SelectableAnimation.Afraid; // Start is called before the first frame update void Start() { m_citizenList = GetComponentsInChildren(); } // Update is called once per frame void FixedUpdate() { if(m_animationOnTimer && DateTime.Now > m_cheerEnd) { m_animationOnTimer = false; m_currentAnimation = m_nextAnimation; } m_timeSinceLastStateChange += Time.deltaTime; if(m_previousFrameAnimation != m_currentAnimation){// Detect change m_timeSinceLastStateChange = 0f; m_previousFrameAnimation = m_currentAnimation; } for(int i = 0; i < m_citizenList.Length; i++){// Statistically change the state if needed if(m_citizenList[i].m_currentAnimation == m_currentAnimation){ continue; }else if(Random.Range(Mathf.Min(m_timeSinceLastStateChange, m_transitionStartVariation), m_transitionStartVariation) > m_transitionStartVariation * 0.995f){ m_citizenList[i].m_blendingTime = Random.Range(m_transitionTime - m_transitionTimeVariation, m_transitionTime + m_transitionTimeVariation); m_citizenList[i].m_currentAnimation = m_currentAnimation; m_citizenList[i].m_animationSpeedModificator = Random.Range(1 - m_animationSpeedVariation, 1 + m_animationSpeedVariation); } } } public void SetAnimationWithTimer(float secs, CitizenCrowdMember.SelectableAnimation newAnimation, CitizenCrowdMember.SelectableAnimation nextAnimation) { m_cheerEnd = DateTime.Now.AddSeconds(secs); m_animationOnTimer = true; m_currentAnimation = newAnimation; m_nextAnimation = nextAnimation; } }