private void Validate() { if (!ValueUtility.IsSupportDistance <TValue>()) { throw new System.NotImplementedException($"distance operation must be implemented for type {typeof(TValue)}"); } }
public bool NextSeq() { if (seqIndex >= values.Count - 2) { return(false); } seqIndex++; seqStartDis = seqEndDis; seqEndDis = seqStartDis + ValueUtility.Distance(seqFrom, seqTo); return(true); }
public bool PreSeq() { if (seqIndex == 0) { return(false); } seqIndex--; seqEndDis = seqStartDis; seqStartDis = seqEndDis - ValueUtility.Distance(seqFrom, seqTo); return(true); }
private static void OnStart(ref State state) { state.seqIndex = 0; state.seqStartDis = 0; state.seqEndDis = state.seqStartDis + ValueUtility.Distance(state.seqFrom, state.seqTo); var totalDis = 0f; for (var index = 0; index < state.values.Count - 1; index++) { totalDis += ValueUtility.Distance(state.values[index], state.values[index + 1]); } state.totalDis = totalDis; }
/// <summary> /// 创建一个属性,代表与目标对象的距离. 其中TValue必须支持距离运算符 /// </summary> public static PropertyAccesser <TObject, float> Distance <TObject, TValue>(TObject target, PropertyAccesser <TObject, TValue> property) { return(new PropertyAccesser <TObject, float>( setter: (source, value) => { var from = property.Get(source); var to = property.Get(target); var dis = ValueUtility.Distance(from, to); var resultValue = ValueUtility.Lerp(from, to, 1 - value / dis); property.Set(source, resultValue); }, getter: (source) => { var from = property.Get(source); var to = property.Get(target); return ValueUtility.Distance(from, to); } )); }
private static void OnUpdate(ActionState actionState, ref State state) { var targetDis = state.totalDis * actionState.interpolatedTime; while (targetDis > state.seqEndDis) { if (!state.NextSeq()) { break; } } while (targetDis < state.seqStartDis) { if (!state.PreSeq()) { break; } } var t = (targetDis - state.seqStartDis) / (state.seqEndDis - state.seqStartDis); var value = ValueUtility.Lerp(state.seqFrom, state.seqTo, t); state.property.UnsafeSet(state.target, value); }
private static void OnUpdate(ActionState actionState, ref State state) { var value = ValueUtility.Lerp(state.from, state.to, actionState.interpolatedTime); state.property.UnsafeSet(state.target, value); }
private static void OnStart(ref State state) { state.from = state.property.UnsafeGet(state.target); state.to = ValueUtility.Add(state.from, state.delta); }