public override (string, float) GetHandAnimation(ViewModelState newState, ViewModelHandednessState handedness) { if (!ShowHands) { return(HandsHidden, -1f); } switch (newState) { case ViewModelState.Idle: return(string.IsNullOrEmpty(HandAnimations.IdleAnim) ? ("Idle", -1) : (HandAnimations.IdleAnim, -1)); case ViewModelState.Raise: return(HandAnimations.RaiseAnim, HandAnimations.RaiseAnimDuration); case ViewModelState.Lower: return(HandAnimations.LowerAnim, HandAnimations.LowerAnimDuration); case ViewModelState.Block: throw new NotImplementedException(); case ViewModelState.Charge: throw new NotImplementedException(); case ViewModelState.Fire: return(HandAnimations.AttackAnim, HandAnimations.AttackAnimDuration); default: Debug.LogWarning($"Tried to get hand state {newState} from {name} which is not supported for {nameof(MeleeWeaponViewModelScript)}"); return("Idle", -1); } }
public override void SetState(ViewModelState newState, ViewModelHandednessState handedness, float timeScale) { if (newState == ViewModelState.Fire) { FireSound.Ref()?.Play(); } }
/// <summary> /// Gets the default animations for a state /// </summary> private string GetAnimForState(ViewModelState state, ViewModelHandednessState handednessState) { //TODO handle this properly //return state.ToString(); //for now return(WeaponViewModelScript.HandsHidden); //if we have no ViewModel, we should not have hands either }
public override void SetState(ViewModelState newState, ViewModelHandednessState handedness, float timeScale) { if (Mode == MeleeWeaponViewModelMode.ExplicitAnimation || Mode == MeleeWeaponViewModelMode.GlueAndAnimate) { ModelAnimator.speed = 1f / timeScale; switch (newState) { case ViewModelState.Idle: ModelAnimator.Play("Idle"); break; case ViewModelState.Raise: ModelAnimator.Play("Raise"); break; case ViewModelState.Lower: ModelAnimator.Play("Lower"); break; case ViewModelState.Block: //TODO break; case ViewModelState.Charge: //TODO break; case ViewModelState.Fire: ModelAnimator.Play("Attack"); break; default: Debug.LogWarning($"Tried to put {name} into state {newState} which is not supported for {nameof(MeleeWeaponViewModelScript)}"); ModelAnimator.Play("Idle"); break; } } //we don't animate in other modes but we still play sounds switch (newState) { case ViewModelState.Raise: //TODO will probably have to rethink raise and lower sounds RaiseSound.Ref()?.Play(); break; case ViewModelState.Lower: LowerSound.Ref()?.Play(); break; case ViewModelState.Fire: AttackSound.Ref()?.Play(); break; } }
public override (string, float) GetHandAnimation(ViewModelState newState, ViewModelHandednessState handednessState) { RangedWeaponViewModelAnimations animSet; //TODO handle 2hand, 1hand, ADS switch (handednessState) { case ViewModelHandednessState.OneHanded: animSet = OneHandAnimations; break; case ViewModelHandednessState.TwoHanded: animSet = TwoHandAnimations; break; case ViewModelHandednessState.ADS: animSet = ADSAnimations; break; default: Debug.LogWarning($"Tried to get animation for \"{handednessState}\" handedness from {name} which is not supported for {nameof(RangedWeaponViewModelScript)}"); return("Idle", -1); } switch (newState) { case ViewModelState.Idle: return(string.IsNullOrEmpty(animSet.IdleAnim) ? ("Idle", -1) : (animSet.IdleAnim, -1)); case ViewModelState.Raise: return(animSet.RaiseAnim, animSet.RaiseAnimDuration); case ViewModelState.Lower: return(animSet.LowerAnim, animSet.LowerAnimDuration); case ViewModelState.Reload: return(animSet.ReloadAnim, animSet.ReloadAnimDuration); case ViewModelState.Charge: return(animSet.ChargeAnim, animSet.ChargeAnimDuration); case ViewModelState.Fire: return(animSet.FireAnim, animSet.FireAnimDuration); case ViewModelState.Recock: return(animSet.RecockAnim, animSet.RecockAnimDuration); default: Debug.LogWarning($"Tried to get hand state {newState} from {name} which is not supported for {nameof(RangedWeaponViewModelScript)}"); return("Idle", -1); } }
public override (string, float) GetHandAnimation(ViewModelState newState, ViewModelHandednessState handednessState) { /* * switch (newState) * { * case ViewModelState.Reload: * return ("LegacyReload", -1); * case ViewModelState.Fire: * return ("LegacyFire", -1); * default: * return ("LegacyIdle", -1); * } */ return("Hidden", -1); }
public override (string, float) GetHandAnimation(ViewModelState newState, ViewModelHandednessState handedness) { switch (newState) { case ViewModelState.Idle: return(IdleAnimation, IdleDuration); case ViewModelState.Raise: return(RaiseAnimation, RaiseDuration); case ViewModelState.Lower: return(LowerAnimation, LowerDuration); case ViewModelState.Fire: return(FireAnimation, FireDuration); default: Debug.LogWarning($"Tried to get hand state {newState} from {name} which is not supported for {nameof(PlaceholderWeaponViewModelScript)}"); return("Idle", -1); } }
public void SetState(ViewModelState newState, WeaponViewModelScript weapon, ViewModelHandednessState handednessState, float timeScale) //TODO extend this for 2hand/1hand/ADS { string stateName = null; float stateDuration = -1; //sentinel value for "use animation value" if (weapon != null) { (stateName, stateDuration) = weapon.GetHandAnimation(newState, handednessState); //grab anim params from model if possible } else { stateName = GetAnimForState(newState, handednessState); } HandsAnimator.Play(stateName); if (stateDuration > 0) { HandsAnimator.speed = (1f / stateDuration) * (1f / timeScale); //we assume animations have a duration of 1 second... TODO make it actually scale considering animation length } else { HandsAnimator.speed = 1 * (1f / timeScale); } }
public override void SetState(ViewModelState newState, ViewModelHandednessState handedness, float timeScale) { if (handedness == ViewModelHandednessState.ADS && AllowADS) { switch (newState) { case ViewModelState.Idle: CurrentFrameSet = ADSIdle; break; case ViewModelState.Raise: CurrentFrameSet = ADSRaise; ADSRaiseSound.Ref()?.Play(); break; case ViewModelState.Lower: CurrentFrameSet = ADSLower; ADSLowerSound.Ref()?.Play(); break; case ViewModelState.Fire: CurrentFrameSet = ADSFire; FireSound.Ref()?.Play(); break; default: Debug.LogWarning($"Tried to put {name} into state {newState} which is not supported for {nameof(SpriteWeaponViewModelScript)}"); break; } } else { if (handedness == ViewModelHandednessState.ADS) { Debug.LogWarning($"Tried to set {nameof(SpriteWeaponViewModelScript)} to ADS frames which is disabled on {name}"); } switch (newState) { case ViewModelState.Idle: CurrentFrameSet = Idle; break; case ViewModelState.Raise: CurrentFrameSet = Raise; RaiseSound.Ref()?.Play(); break; case ViewModelState.Lower: CurrentFrameSet = Lower; LowerSound.Ref()?.Play(); break; case ViewModelState.Reload: CurrentFrameSet = Reload; ReloadSound.Ref()?.Play(); break; case ViewModelState.Fire: CurrentFrameSet = Fire; FireSound.Ref()?.Play(); break; default: Debug.LogWarning($"Tried to put {name} into state {newState} which is not supported for {nameof(SpriteWeaponViewModelScript)}"); break; } } CurrentFrameIndex = 0; Timescale = AllowTimescale ? timeScale : 1; TimeInFrame = 0; SetImage(CurrentFrameSet, CurrentFrameIndex); }
public override (string, float) GetHandAnimation(ViewModelState newState, ViewModelHandednessState handedness) { return("Hidden", -1); //always hide hands }
public override void SetState(ViewModelState newState, ViewModelHandednessState handednessState, float timeScale) { if (State == newState) { return; } switch (newState) { case ViewModelState.Fire: //spawn effect if exists if (EffectPrefab != null) { EffectObject = Instantiate <GameObject>(EffectPrefab, EffectPoint); } //play fire animation if exists if (AnimController != null) { if (!string.IsNullOrEmpty(FiringState)) { AnimController.Play(FiringState); } } //play sound if exists if (FireSound != null) { FireSound.Play(); } break; case ViewModelState.Reload: //play reload animation if exists if (AnimController != null) { if (!string.IsNullOrEmpty(ReloadingState)) { AnimController.Play(ReloadingState); } } //play sound if exists if (ReloadSound != null) { ReloadSound.Play(); } break; default: if (AnimController != null) { if (UseMoveStateTransitions) { AnimController.SetBool("IsMoving", false); } else { //enter Fixed state, set anim accordingly if (!string.IsNullOrEmpty(FixedState)) { AnimController.Play(FixedState); } //stop anim if we don't have an actual fixed one else { AnimController.StopPlayback(); } } } break; } State = newState; }
public abstract (string, float) GetHandAnimation(ViewModelState newState, ViewModelHandednessState handedness);
public abstract void SetState(ViewModelState newState, ViewModelHandednessState handedness, float timeScale);
/// <summary> /// Gets the default animations for a state /// </summary> private string GetAnimForState(ViewModelState state, ViewModelHandednessState handednessState) { //TODO handle this properly return(state.ToString()); //for now }
public override void SetState(ViewModelState newState, ViewModelHandednessState handednessState, float timeScale) { if (ModelAnimator == null) { Debug.LogWarning($"{nameof(RangedWeaponViewModelScript)} on {name} has no {nameof(ModelAnimator)} attached!"); return; } //TODO moving the model when entering and exiting ADS bool wasInADS = InADS; string prefix; switch (handednessState) { case ViewModelHandednessState.TwoHanded: prefix = ""; //no prefix InADS = false; break; case ViewModelHandednessState.OneHanded: prefix = "OneHand"; InADS = false; break; case ViewModelHandednessState.ADS: prefix = "ADS"; InADS = true; break; default: Debug.LogWarning($"Tried to put {name} into animation with handedness \"{handednessState}\" which is not supported for {nameof(RangedWeaponViewModelScript)}"); ModelAnimator.Play("Idle"); return; } //ADS<->non-ADS transitions; no support for animations yet if (CenterModelInAds) { if (wasInADS && !InADS) { //move from ADS to not ADS InterpolateADSTransition(ModelDefaultPosition, ModelDefaultRotation); } else if (!wasInADS && InADS) { //move from not ADS to ADS Vector3 posTargetWorld = WeaponComponent.CenterViewModelPoint.position; Vector3 vecOffsetToOrigin = ModelTransform.localPosition - ADSOffsetPoint.localPosition; ModelTransform.position = posTargetWorld + WeaponComponent.CenterViewModelPoint.TransformVector(ADSOffsetPoint.localPosition); Vector3 targetPosition = ModelTransform.localPosition; ModelTransform.localPosition = ModelDefaultPosition; ModelTransform.rotation = WeaponComponent.CenterViewModelPoint.rotation; Quaternion rotCenterPlusOffset = ModelTransform.localRotation * ADSOffsetPoint.localRotation; ModelTransform.localRotation = rotCenterPlusOffset; Quaternion targetRotation = ModelTransform.localRotation; ModelTransform.localRotation = ModelDefaultRotation; InterpolateADSTransition(targetPosition, targetRotation); } } ModelAnimator.speed = 1f / timeScale; switch (newState) { case ViewModelState.Idle: ModelAnimator.Play(prefix + "Idle"); break; case ViewModelState.Raise: ModelAnimator.Play(prefix + "Raise"); RaiseSound.Ref()?.Play(); break; case ViewModelState.Lower: ModelAnimator.Play(prefix + "Lower"); LowerSound.Ref()?.Play(); break; case ViewModelState.Reload: ModelAnimator.Play(prefix + "Reload"); if (ReloadSound != null) { ReloadSound.pitch = 1f / timeScale; ReloadSound.Play(); } break; case ViewModelState.Charge: ModelAnimator.Play(prefix + "Charge"); break; case ViewModelState.Fire: ModelAnimator.Play(prefix + "Fire"); FireSound.Ref()?.Play(); FireParticleSystem.Ref()?.Play(); FlashFireLight(); EjectShell(); break; case ViewModelState.Recock: ModelAnimator.Play(prefix + "Recock"); break; default: Debug.LogWarning($"Tried to put {name} into state {newState} which is not supported for {nameof(RangedWeaponViewModelScript)}"); ModelAnimator.Play("Idle"); break; } }