void setNodeCollisionListeners(ColliderNode node) { GameObject colObj = node.colliderObject; colObj.GetComponent <CollisionNodeToggler>().nodeCollisionHandler += nodeCollisionHandler; node.eventListenerSet = true; }
/// <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); } }
/// <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; } } } }
/// <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; } } }
void setNodeCollisionListeners(ColliderNode node) { GameObject colObj = node.colliderObject; colObj.GetComponent<CollisionNodeToggler>().nodeCollisionHandler += nodeCollisionHandler; node.eventListenerSet = true; }
/// <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); }