123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- using System;
- using System.IO;
- using System.Collections.Generic;
- using UnityEngine;
- using Spine;
- [ExecuteInEditMode]
- [AddComponentMenu("Spine/BoneFollower")]
- public class BoneFollower : MonoBehaviour
- {
- [System.NonSerialized]
- public bool
- valid;
- public SkeletonRenderer skeletonRenderer;
- public Bone bone;
- public bool followZPosition = true;
- public bool followBoneRotation = true;
- public SkeletonRenderer SkeletonRenderer
- {
- get { return skeletonRenderer; }
- set
- {
- skeletonRenderer = value;
- Reset();
- }
- }
-
- public String boneName;
- public bool resetOnAwake = true;
- protected Transform cachedTransform;
- protected Transform skeletonTransform;
- public void HandleResetRenderer(SkeletonRenderer skeletonRenderer)
- {
- Reset();
- }
- public void Reset()
- {
- bone = null;
- cachedTransform = transform;
- valid = skeletonRenderer != null && skeletonRenderer.valid;
- if (!valid)
- return;
- skeletonTransform = skeletonRenderer.transform;
- skeletonRenderer.OnReset -= HandleResetRenderer;
- skeletonRenderer.OnReset += HandleResetRenderer;
- if (Application.isEditor)
- DoUpdate();
- }
- void OnDestroy()
- {
-
- if (skeletonRenderer != null)
- skeletonRenderer.OnReset -= HandleResetRenderer;
- }
- public void Awake()
- {
- if (resetOnAwake)
- Reset();
- }
- void LateUpdate()
- {
- DoUpdate();
- }
- public void DoUpdate()
- {
- if (!valid)
- {
- Reset();
- return;
- }
- if (bone == null)
- {
- if (boneName == null || boneName.Length == 0)
- return;
- bone = skeletonRenderer.skeleton.FindBone(boneName);
- if (bone == null)
- {
- Debug.LogError("Bone not found: " + boneName, this);
- return;
- }
- else
- {
- }
- }
- Spine.Skeleton skeleton = skeletonRenderer.skeleton;
- float flipRotation = (skeleton.flipX ^ skeleton.flipY) ? -1f : 1f;
- if (cachedTransform.parent == skeletonTransform)
- {
- cachedTransform.localPosition = new Vector3(bone.worldX, bone.worldY, followZPosition ? 0f : cachedTransform.localPosition.z);
- if (followBoneRotation)
- {
- Vector3 rotation = cachedTransform.localRotation.eulerAngles;
- cachedTransform.localRotation = Quaternion.Euler(rotation.x, rotation.y, bone.worldRotation * flipRotation);
- }
- }
- else
- {
- Vector3 targetWorldPosition = skeletonTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY, 0f));
- if (!followZPosition)
- targetWorldPosition.z = cachedTransform.position.z;
- cachedTransform.position = targetWorldPosition;
- if (followBoneRotation)
- {
- Vector3 rotation = skeletonTransform.rotation.eulerAngles;
- cachedTransform.rotation = Quaternion.Euler(rotation.x, rotation.y, skeletonTransform.rotation.eulerAngles.z + (bone.worldRotation * flipRotation));
- }
- }
- }
- }
|