コード例 #1
0
        void setNodeCollisionListeners(ColliderNode node)
        {
            GameObject colObj = node.colliderObject;

            colObj.GetComponent <CollisionNodeToggler>().nodeCollisionHandler += nodeCollisionHandler;

            node.eventListenerSet = true;
        }
コード例 #2
0
        /// <summary>
        /// Internal function.
        /// </summary>
        /// <param name="node"></param>
        public void addColliderToNode(ColliderNode node)
        {
            GameObject tmp = createColliderObject(node.nodeName, transform, node.nodePath);

            node.colliderObject = tmp;

            if (Application.isPlaying)
            {
                setNodeCollisionListeners(node);
            }
        }
コード例 #3
0
        /// <summary>
        /// Internal function.
        /// </summary>
        /// <param name="node"></param>
        public void updateCollisionTransformsForNode(ColliderNode node)
        {
            //SpriteTransform is transform data of animation node, include postion, rotation, scale, shear
            //SpriteTransform is in local space of SpriteRenderer component gameObject

            if (spriteRenderer == null)
            {
                spriteRenderer = GetComponent <SpriteRenderer>();
            }

            SpriteTransform nodeTransform = spriteRenderer.GetSpriteTransformByFullPathHash(node.nodePathHash);

            if (nodeTransform == null)
            {
                return;
            }

            // Find the sprite object
            Sprite partSprite = null;

            if (nodeTransform.overrideSprite != null)
            {
                partSprite = nodeTransform.overrideSprite;
            }

            else if (nodeTransform.sprite != null)
            {
                partSprite = nodeTransform.sprite;
            }

            if (nodeTransform != null && partSprite)
            {
                //todo:
                // 1. setting collider to correct center and size
                // You can get use Sprite and SpriteTransform to calculate the bounding box of a animation part.
                // And use the bounding box data to set the center and size
                // 2. setting collider in correct plane in world space.
                // EasyMotion2D support sprite rendering to 3 plane: XY, ZY, XZ. Collider should be in correct plane
                // etc

                Vector3    position = Vector3.zero;
                Quaternion rotation = Quaternion.identity;
                Vector3    scale    = Vector3.one;
                Vector3    size     = Vector3.one;
                Vector3    center   = Vector3.zero;

                float   localRotation = spriteRenderer.localRotation;
                Vector2 localScale    = spriteRenderer.localScale;
                bool    rr            = localScale.x * localScale.y < 0f;
                float   sr            = rr  ? -1f : 1f;


                float pr   = Mathf.Deg2Rad * (localRotation);
                float psin = Mathf.Sin(pr);
                float pcos = Mathf.Cos(pr);


                float psx = (nodeTransform.position.x) * localScale.x;
                float psy = (nodeTransform.position.y) * localScale.y;

                float tx = (psx * pcos - psy * psin);
                float ty = (psx * psin + psy * pcos);



                switch (spriteRenderer.plane)
                {
                case SpritePlane.PlaneXY:
                {
                    position = new Vector3(tx, ty, node.depthOffset);

                    rotation = Quaternion.Euler(0, 0, localRotation + nodeTransform.rotation * sr);

                    scale = new Vector3((1.0f + nodeTransform.shear.y) * localScale.x,
                                        (1.0f + nodeTransform.shear.x) * localScale.y,
                                        1);

                    size = new Vector3((partSprite.imageRect.width * nodeTransform.scale.x),
                                       (partSprite.imageRect.height * nodeTransform.scale.y),
                                       node.thickness);

                    center = new Vector3((partSprite.imageRect.width * 0.5f - partSprite.pivot.x),
                                         (partSprite.imageRect.height * 0.5f - partSprite.pivot.y),
                                         0);

                    center.y = -center.y;
                }
                break;

                case SpritePlane.PlaneZY:
                {
                    position = new Vector3(-node.depthOffset, ty, tx);

                    rotation = Quaternion.Euler(-localRotation + nodeTransform.rotation * -sr, 0, 0);

                    scale = new Vector3(1,
                                        (1.0f + nodeTransform.shear.x) * localScale.y,
                                        (1.0f + nodeTransform.shear.y) * localScale.x);

                    size = new Vector3(node.thickness,
                                       partSprite.imageRect.height * nodeTransform.scale.y,
                                       partSprite.imageRect.width * nodeTransform.scale.x);

                    center = new Vector3(0,
                                         (partSprite.imageRect.height * 0.5f - partSprite.pivot.y),
                                         (partSprite.imageRect.width * 0.5f - partSprite.pivot.x)
                                         );

                    center.y = -center.y;
                }
                break;

                case SpritePlane.PlaneXZ:
                {
                    position = new Vector3(tx, -node.depthOffset, ty);

                    rotation = Quaternion.Euler(0, (-localRotation - nodeTransform.rotation * sr) + (rr ? 180f : 0f), 0);

                    scale = new Vector3((1.0f + nodeTransform.shear.y) * localScale.y,
                                        1,
                                        (1.0f + nodeTransform.shear.x) * localScale.x);

                    size = new Vector3(partSprite.imageRect.width * nodeTransform.scale.x,
                                       node.thickness,
                                       partSprite.imageRect.height * nodeTransform.scale.y);

                    center = new Vector3((partSprite.imageRect.width * 0.5f - partSprite.pivot.x),
                                         0,
                                         (partSprite.imageRect.height * 0.5f - partSprite.pivot.y));

                    center.z = -center.z;
                }
                break;
                }



                Transform t = node.colliderObject.transform;

                t.localPosition = position;
                t.localRotation = rotation;
                t.localScale    = scale;

                BoxCollider tmpCollider = (node.colliderObject.collider as BoxCollider);


                tmpCollider.center = center;
                tmpCollider.size   = size;



                if (Application.isPlaying)
                {
                    // Check the collision listener event
                    if (!node.eventListenerSet)
                    {
                        setNodeCollisionListeners(node);
                    }
                }
                else
                {
                    // If the game is not playing, but the collision listener is still set, disable it so we know to reenable
                    //	it when the game is playing.
                    if (node.eventListenerSet)
                    {
                        node.eventListenerSet = false;
                    }
                }
            }
        }
コード例 #4
0
        /// <summary>
        /// Internal function.
        /// </summary>
        /// <param name="node"></param>
        public void updateCollisionTransformsForNode(ColliderNode node)
        {
            //SpriteTransform is transform data of animation node, include postion, rotation, scale, shear
            //SpriteTransform is in local space of SpriteRenderer component gameObject

            if (spriteRenderer == null)
                spriteRenderer = GetComponent<SpriteRenderer>();

            SpriteTransform nodeTransform = spriteRenderer.GetSpriteTransformByFullPathHash(node.nodePathHash);
            if (nodeTransform == null)
                return;

            // Find the sprite object
            Sprite partSprite = null;
            if (nodeTransform.overrideSprite != null)
            {
                partSprite = nodeTransform.overrideSprite;
            }

            else if (nodeTransform.sprite != null)
            {
                partSprite = nodeTransform.sprite;
            }

            if (nodeTransform != null && partSprite)
            {
                //todo: 
                // 1. setting collider to correct center and size
                // You can get use Sprite and SpriteTransform to calculate the bounding box of a animation part. 
                // And use the bounding box data to set the center and size
                // 2. setting collider in correct plane in world space.
                // EasyMotion2D support sprite rendering to 3 plane: XY, ZY, XZ. Collider should be in correct plane
                // etc

                Vector3 position = Vector3.zero;
                Quaternion rotation = Quaternion.identity;
                Vector3 scale = Vector3.one;
                Vector3 size = Vector3.one;
                Vector3 center = Vector3.zero;

                float localRotation = spriteRenderer.localRotation;
                Vector2 localScale = spriteRenderer.localScale;
                bool rr = localScale.x * localScale.y < 0f;
                float sr = rr  ? -1f : 1f;


                float pr = Mathf.Deg2Rad * (localRotation);
                float psin = Mathf.Sin(pr);
                float pcos = Mathf.Cos(pr);


                float psx = (nodeTransform.position.x) * localScale.x;
                float psy = (nodeTransform.position.y) * localScale.y;

                float tx = (psx * pcos - psy * psin);
                float ty = (psx * psin + psy * pcos);



                switch (spriteRenderer.plane)
                {
                    case SpritePlane.PlaneXY:
                        {
                            position = new Vector3( tx, ty, node.depthOffset);

                            rotation = Quaternion.Euler(0, 0, localRotation + nodeTransform.rotation * sr);

                            scale = new Vector3( (1.0f + nodeTransform.shear.y) * localScale.x, 
                                (1.0f + nodeTransform.shear.x) * localScale.y, 
                                1);

                            size = new Vector3((partSprite.imageRect.width * nodeTransform.scale.x),
                                (partSprite.imageRect.height * nodeTransform.scale.y),
                                node.thickness);

                            center = new Vector3((partSprite.imageRect.width * 0.5f - partSprite.pivot.x),
                                (partSprite.imageRect.height * 0.5f - partSprite.pivot.y),
                                0);

                            center.y = -center.y;
                        }
                        break;

                    case SpritePlane.PlaneZY:
                        {
                            position = new Vector3(-node.depthOffset, ty, tx);

                            rotation = Quaternion.Euler(-localRotation + nodeTransform.rotation * -sr, 0, 0);

                            scale = new Vector3(1, 
                                (1.0f + nodeTransform.shear.x) * localScale.y, 
                                (1.0f + nodeTransform.shear.y) * localScale.x);

                            size = new Vector3(node.thickness,
                                partSprite.imageRect.height * nodeTransform.scale.y,
                                partSprite.imageRect.width * nodeTransform.scale.x);

                            center = new Vector3(0,
                                (partSprite.imageRect.height * 0.5f - partSprite.pivot.y),
                                (partSprite.imageRect.width * 0.5f - partSprite.pivot.x)
                                );

                            center.y = -center.y;
                        }
                        break;

                    case SpritePlane.PlaneXZ:
                        {

                            position = new Vector3( tx, -node.depthOffset, ty);

                            rotation = Quaternion.Euler(0, (-localRotation - nodeTransform.rotation * sr) + (rr ? 180f : 0f), 0);
                            
                            scale = new Vector3( (1.0f + nodeTransform.shear.y) * localScale.y,
                                1,
                                (1.0f + nodeTransform.shear.x) * localScale.x);

                            size = new Vector3(partSprite.imageRect.width * nodeTransform.scale.x,
                                node.thickness,
                                partSprite.imageRect.height * nodeTransform.scale.y);

                            center = new Vector3((partSprite.imageRect.width * 0.5f - partSprite.pivot.x),
                                0,
                                (partSprite.imageRect.height * 0.5f - partSprite.pivot.y) );

                            center.z = -center.z;
                        }
                        break;
                }



                Transform t = node.colliderObject.transform;

                t.localPosition = position;
                t.localRotation = rotation;
                t.localScale = scale;

                BoxCollider tmpCollider = (node.colliderObject.collider as BoxCollider);


                tmpCollider.center = center;
                tmpCollider.size = size;



                if (Application.isPlaying)
                {
                    // Check the collision listener event
                    if (!node.eventListenerSet)
                    {
                        setNodeCollisionListeners(node);
                    }
                }
                else
                {
                    // If the game is not playing, but the collision listener is still set, disable it so we know to reenable
                    //	it when the game is playing.
                    if (node.eventListenerSet)
                        node.eventListenerSet = false;
                }
            }
        }
コード例 #5
0
        void setNodeCollisionListeners(ColliderNode node)
        {
            GameObject colObj = node.colliderObject;
            colObj.GetComponent<CollisionNodeToggler>().nodeCollisionHandler += nodeCollisionHandler;

            node.eventListenerSet = true;
        }
コード例 #6
0
        /// <summary>
        /// Internal function.
        /// </summary>
        /// <param name="node"></param>
        public void addColliderToNode(ColliderNode node)
        {
            GameObject tmp = createColliderObject(node.nodeName, transform, node.nodePath);
            node.colliderObject = tmp;

            if (Application.isPlaying)
                setNodeCollisionListeners(node);
        }