Пример #1
0
        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;
        }
Пример #2
0
 public Tamagotchi(State state, IStateModifier energyDecrementModifierModifier, IStateModifier timeModifier,
     IDictionary<Food, IStateModifier> foodReaction)
 {
     _state = state;
     _energyDecrementModifierModifier = energyDecrementModifierModifier;
     _timeModifier = timeModifier;
     _foodReaction = foodReaction;
 }
Пример #3
0
        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;
        }
Пример #4
0
        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);
                                    }
                                }
                        }
                    }
                }
            }
        }