public void AddNodeModifierType(System.Type tp) { if (tp == null) { throw new System.ArgumentNullException("tp"); } if (!TypeUtil.IsType(tp, typeof(IStateModifier))) { return; // throw new System.ArgumentException("Type must implement IModifier.", "tp"); } if (_modifierTable == null) { _modifierTable = new Dictionary <System.Type, IStateModifier[]>(); } var path = _path.Path; int cnt = path.Count; IStateModifier[] arr = new IStateModifier[cnt]; for (int i = 0; i < cnt; i++) { var p = GameObjectUtil.GetGameObjectFromSource(path.ControlPoint(i)); if (p != null) { arr[i] = p.GetComponent(tp) as IStateModifier; } } _modifierTable[tp] = arr; }
public Tamagotchi(State state, IStateModifier energyDecrementModifierModifier, IStateModifier timeModifier, IDictionary<Food, IStateModifier> foodReaction) { _state = state; _energyDecrementModifierModifier = energyDecrementModifierModifier; _timeModifier = timeModifier; _foodReaction = foodReaction; }
public void AddNodeModifierType <T>() where T : IStateModifier { if (_modifierTable == null) { _modifierTable = new Dictionary <System.Type, IStateModifier[]>(); } var path = _path.Path; int cnt = path.Count; IStateModifier[] arr = new IStateModifier[cnt]; for (int i = 0; i < cnt; i++) { var p = GameObjectUtil.GetGameObjectFromSource(path.ControlPoint(i)); if (p != null) { arr[i] = p.GetComponent <T>() as IStateModifier; } } _modifierTable[typeof(T)] = arr; }
public void LerpToTarget(object targ, float t, float lerpT) { if (_dur == 0f) { t = 1f; } else { t = t / _dur; } if (_updateTranslation > TranslationOptions.None || _updateRotation >= RotationOptions.Heading) { var trans = GameObjectUtil.GetTransformFromSource(targ); if (trans != null) { if (_updateRotation == RotationOptions.Heading) { var wp = _path.Path.GetWaypointAt(t); this.SetPosition(trans, wp.Position, float.NaN); this.SetRotation(trans, Quaternion.LookRotation(wp.Heading), lerpT); } else if (_updateTranslation > TranslationOptions.None) { this.SetPosition(trans, _path.Path.GetPositionAt(t), lerpT); } } } bool useModifiers = (_modifierTable != null && _modifierTable.Count > 0); if (useModifiers || _updateRotation == RotationOptions.Rotation || _updateRotation == RotationOptions.LocalRotation) { var data = _path.Path.GetRelativePositionData(t); var cnt = _path.Path.Count; int i = data.Index; int j = (_path.Path.IsClosed) ? (i + 1) % cnt : i + 1; if (_updateRotation == RotationOptions.Rotation || _updateRotation == RotationOptions.LocalRotation) { var trans = GameObjectUtil.GetTransformFromSource(targ); if (trans != null) { var a = (i >= 0 && i < cnt) ? ComponentUtil.GetComponentFromSource <Transform>(_path.Path.ControlPoint(i)) : null; var b = (j >= 0 && j < cnt) ? ComponentUtil.GetComponentFromSource <Transform>(_path.Path.ControlPoint(j)) : null; if (a != null) { bool useRelative = _path.TransformRelativeTo != null; var r = (useRelative) ? a.GetRelativeRotation(_path.TransformRelativeTo) : a.rotation; if (b != null) { var rb = (useRelative) ? b.GetRelativeRotation(_path.TransformRelativeTo) : b.rotation; r = Quaternion.LerpUnclamped(r, rb, data.TPrime); } this.SetRotation(trans, r, lerpT); } } } if (useModifiers) { var e = _modifierTable.GetEnumerator(); while (e.MoveNext()) { var len = e.Current.Value.Length; var ma = (i >= 0 && i < len) ? e.Current.Value[i] : null; var mb = (j >= 0 && j < len) ? e.Current.Value[j] : null; if (float.IsNaN(lerpT)) { if (ma != null) { if (mb != null) { using (var state = StateToken.GetToken()) { ma.CopyTo(state); mb.LerpTo(state, data.TPrime); ma.ModifyWith(targ, state); } } else { ma.Modify(targ); } } else if (mb != null) { mb.Modify(targ); } } else { using (var curState = StateToken.GetToken()) using (var state = StateToken.GetToken()) { IStateModifier m = null; if (ma != null) { m = ma; if (mb != null) { ma.CopyTo(state); mb.LerpTo(state, data.TPrime); } else { ma.CopyTo(state); } } else if (mb != null) { m = mb; mb.CopyTo(state); } if (m != null) { state.CopyTo(curState); curState.SyncFrom(targ); curState.LerpTo(state, lerpT); m.ModifyWith(state, curState); } } } } } } }