Example #1
0
 public Nima.Animation.ActorAnimationInstance GetAnimationInstance(string name)
 {
     Nima.Animation.ActorAnimation animation = GetAnimation(name);
     if (animation == null)
     {
         return(null);
     }
     return(new Nima.Animation.ActorAnimationInstance(this, animation));
 }
Example #2
0
        public void Start()
        {
            ActorBaseComponent actor = gameObject.GetComponent <ActorBaseComponent>();

            if (actor != null)
            {
                m_ActorInstance = actor.ActorInstance;
                if (m_ActorInstance != null)
                {
                    m_Animation = m_ActorInstance.GetAnimation(m_AnimationName);
                }
            }
            m_AnimationTime = m_Offset * m_Animation.Duration;
        }
Example #3
0
        private void ReadAnimationsBlock(BlockReader block)
        {
            // Read animations.
            int animationCount = block.ReadUInt16();

            m_Animations = new Nima.Animation.ActorAnimation[animationCount];
            BlockReader animationBlock = null;
            int         animationIndex = 0;

            while ((animationBlock = block.ReadNextBlock()) != null)
            {
                switch (animationBlock.BlockType)
                {
                case (int)BlockTypes.Animation:
                    Nima.Animation.ActorAnimation anim = Nima.Animation.ActorAnimation.Read(animationBlock, m_Components);
                    m_Animations[animationIndex++] = anim;
                    //ReadAnimationBlock(actor, block);
                    break;
                }
            }
            ;
        }
Example #4
0
        public void Start()
        {
            m_Actor = gameObject.GetComponent <ActorBaseComponent>();
            if (m_Actor != null)
            {
                // Get a game object from the actor, use this to mount items or query for other components.
                // GameObject headColliderGameObject = m_Actor.GetActorGameObject("HeadCollider");
                // if(headColliderGameObject != null)
                // {
                //  Collider2D collider = headColliderGameObject.GetComponent<Collider2D>();
                //  if(collider != null)
                //  {
                //      // Set it to a trigger, or do something else with it...
                //      // collider.isTrigger = true;
                //  }
                // }
                if (m_Actor.ActorInstance != null)
                {
                    m_Idle       = m_Actor.ActorInstance.GetAnimation("Idle");
                    m_Aim        = m_Actor.ActorInstance.GetAnimation("Aim2");
                    m_Walk       = m_Actor.ActorInstance.GetAnimationInstance("Walk");
                    m_Run        = m_Actor.ActorInstance.GetAnimation("Run");
                    m_WalkToIdle = m_Actor.ActorInstance.GetAnimation("WalkToIdle");

                    // We made walk an animation instance so it has it's own sense of time which lets it do things like track events.
                    m_Walk.AnimationEvent += delegate(object animationInstance, Nima.Animation.AnimationEventArgs args)
                    {
                        // Event triggered from animation.
                    };
                    ActorNode characterNode = m_Actor.ActorInstance.GetNode("Character");
                    if (characterNode != null)
                    {
                        m_GroundSpeedProperty = characterNode.GetCustomFloatProperty("GroundSpeed");
                        m_IsRunningProperty   = characterNode.GetCustomBooleanProperty("IsRunning");
                    }
                    // Calculate aim slices.
                    if (m_Aim != null)
                    {
                        ActorNode muzzle = m_Actor.ActorInstance.GetNode("Muzzle");
                        if (muzzle != null)
                        {
                            for (int i = 0; i < AimSliceCount; i++)
                            {
                                float position = i / (float)(AimSliceCount - 1) * m_Aim.Duration;
                                m_Aim.Apply(position, m_Actor.ActorInstance, 1.0f);
                                m_Actor.ActorInstance.Advance(0.0f);
                                Mat2D worldTransform = muzzle.WorldTransform;

                                AimSlice slice = m_AimLookup[i];

                                // Extract forward vector and position.
                                slice.dir = new Vec2D();
                                Vec2D.Normalize(slice.dir, new Vec2D(worldTransform[0], worldTransform[1]));
                                slice.point    = new Vec2D(worldTransform[4] * ActorAsset.NimaToUnityScale, worldTransform[5] * ActorAsset.NimaToUnityScale);
                                m_AimLookup[i] = slice;
                            }
                        }
                        if (m_Walk != null)
                        {
                            m_Walk.Time = 0.0f;
                            m_Walk.Apply(1.0f);

                            for (int i = 0; i < AimSliceCount; i++)
                            {
                                float position = i / (float)(AimSliceCount - 1) * m_Aim.Duration;
                                m_Aim.Apply(position, m_Actor.ActorInstance, 1.0f);
                                m_Actor.ActorInstance.Advance(0.0f);
                                Mat2D worldTransform = muzzle.WorldTransform;

                                AimSlice slice = m_AimWalkingLookup[i];

                                // Extract forward vector and position.
                                slice.dir = new Vec2D();
                                Vec2D.Normalize(slice.dir, new Vec2D(worldTransform[0], worldTransform[1]));
                                slice.point           = new Vec2D(worldTransform[4] * ActorAsset.NimaToUnityScale, worldTransform[5] * ActorAsset.NimaToUnityScale);
                                m_AimWalkingLookup[i] = slice;
                            }
                        }
                    }
                }
            }
            m_IdleTime = 0.0f;
        }
        public void Update()
        {
            if (m_Animator == null || m_Actor == null)
            {
                return;
            }
            int numLayers = m_Animator.layerCount;

            for (int i = 0; i < numLayers; i++)
            {
                float             layerMix      = i == 0 ? 1.0f : m_Animator.GetLayerWeight(i);
                AnimatorStateInfo stateInfo     = m_Animator.GetCurrentAnimatorStateInfo(i);
                AnimatorStateInfo nextStateInfo = m_Animator.GetNextAnimatorStateInfo(i);

                bool hasNext = nextStateInfo.fullPathHash != 0;
                AnimatorClipInfo[] clipInfos     = m_Animator.GetCurrentAnimatorClipInfo(i);
                AnimatorClipInfo[] nextClipInfos = m_Animator.GetNextAnimatorClipInfo(i);

                for (int c = 0; c < clipInfos.Length; c++)
                {
                    AnimatorClipInfo clipInfo = clipInfos[c];
                    float            mix      = clipInfo.weight * layerMix;

                    if (mix == 0.0f)
                    {
                        continue;
                    }
                    Nima.Animation.ActorAnimation actorAnimation = ClipToAnimation(clipInfo.clip);
                    if (actorAnimation != null)
                    {
                        float time = (stateInfo.normalizedTime * clipInfo.clip.length);
                        if (stateInfo.loop)
                        {
                            time %= actorAnimation.Duration;
                        }
                        actorAnimation.Apply(time, m_Actor, mix);
                    }
                }
                if (hasNext)
                {
                    for (int c = 0; c < nextClipInfos.Length; c++)
                    {
                        AnimatorClipInfo clipInfo = nextClipInfos[c];
                        float            mix      = clipInfo.weight * layerMix;
                        if (mix == 0.0f)
                        {
                            continue;
                        }
                        Nima.Animation.ActorAnimation actorAnimation = ClipToAnimation(clipInfo.clip);
                        if (actorAnimation != null)
                        {
                            float time = (nextStateInfo.normalizedTime * clipInfo.clip.length);
                            if (nextStateInfo.loop)
                            {
                                time %= actorAnimation.Duration;
                            }
                            actorAnimation.Apply(time, m_Actor, mix);
                        }
                    }
                }
            }
        }
        void Start()
        {
            m_Animator = GetComponent <Animator>();
            m_Actor    = gameObject.GetComponent <ActorBaseComponent>();
            if (m_Actor != null)
            {
                if (m_Actor.ActorInstance != null)
                {
                    m_Aim = m_Actor.ActorInstance.GetAnimation("Aim2");
                    Nima.Animation.ActorAnimation walk       = m_Actor.ActorInstance.GetAnimation("Walk");
                    Nima.Animation.ActorAnimation walkToIdle = m_Actor.ActorInstance.GetAnimation("WalkToIdle");


                    // Calculate aim slices.
                    if (m_Aim != null)
                    {
                        ActorNode muzzle = m_Actor.ActorInstance.GetNode("Muzzle");
                        if (muzzle != null)
                        {
                            for (int i = 0; i < AimSliceCount; i++)
                            {
                                float position = i / (float)(AimSliceCount - 1) * m_Aim.Duration;
                                m_Aim.Apply(position, m_Actor.ActorInstance, 1.0f);
                                Mat2D worldTransform = muzzle.WorldTransform;

                                AimSlice slice = m_AimLookup[i];

                                // Extract forward vector and position.
                                slice.dir = new Vec2D();
                                Vec2D.Normalize(slice.dir, new Vec2D(worldTransform[0], worldTransform[1]));
                                slice.point    = new Vec2D(worldTransform[4], worldTransform[5]);
                                m_AimLookup[i] = slice;
                            }
                        }
                        if (walk != null)
                        {
                            walk.Apply(0.0f, m_Actor.ActorInstance, 1.0f);

                            for (int i = 0; i < AimSliceCount; i++)
                            {
                                float position = i / (float)(AimSliceCount - 1) * m_Aim.Duration;
                                m_Aim.Apply(position, m_Actor.ActorInstance, 1.0f);
                                Mat2D worldTransform = muzzle.WorldTransform;

                                AimSlice slice = m_AimWalkingLookup[i];

                                // Extract forward vector and position.
                                slice.dir = new Vec2D();
                                Vec2D.Normalize(slice.dir, new Vec2D(worldTransform[0], worldTransform[1]));
                                slice.point           = new Vec2D(worldTransform[4], worldTransform[5]);
                                m_AimWalkingLookup[i] = slice;
                            }
                        }

                        if (walkToIdle != null)
                        {
                            walkToIdle.Apply(walkToIdle.Duration, m_Actor.ActorInstance, 1.0f);
                        }
                    }
                }
            }
        }