//

 //SpringCollider for unity-chan!

 //

 //Original Script is here:

 //ricopin / SpringCollider.cs

 //Rocket Jump : http://rocketjump.skr.jp/unity3d/109/

 //https://twitter.com/ricopin416

 //

 using UnityEngine;

 using System.Collections;

 namespace UnityChan

 {

     public class SpringCollider : MonoBehaviour

     {

         //半径

         public float radius = 0.5f;

         private void OnDrawGizmosSelected ()

         {

             Gizmos.color = Color.green;

             Gizmos.DrawWireSphere (transform.position, radius);

         }

     }

 }

SpringCollider

 //

 //SpringBone.cs for unity-chan!

 //

 //Original Script is here:

 //ricopin / SpringBone.cs

 //Rocket Jump : http://rocketjump.skr.jp/unity3d/109/

 //https://twitter.com/ricopin416

 //

 //Revised by N.Kobayashi 2014/06/20

 //

 using UnityEngine;

 using System.Collections;

 namespace UnityChan

 {

     public class SpringBone : MonoBehaviour

     {

         //次のボーン

         public Transform child;

         //ボーンの向き

         public Vector3 boneAxis = new Vector3 (-1.0f, 0.0f, 0.0f);

         public float radius = 0.05f;

         //各SpringBoneに設定されているstiffnessForceとdragForceを使用するか?

         public bool isUseEachBoneForceSettings = false; 

         //バネが戻る力

         public float stiffnessForce = 0.01f;

         //力の減衰力

         public float dragForce = 0.4f;

         public Vector3 springForce = new Vector3 (0.0f, -0.0001f, 0.0f);

         public SpringCollider[] colliders;

         public bool debug = true;

         //Kobayashi:Thredshold Starting to activate activeRatio

         public float threshold = 0.01f;

         private float springLength;

         private Quaternion localRotation;

         private Transform trs;

         private Vector3 currTipPos;

         private Vector3 prevTipPos;

         //Kobayashi

         private Transform org;

         //Kobayashi:Reference for "SpringManager" component with unitychan 

         private SpringManager managerRef;

         private void Awake ()

         {

             trs = transform;

             localRotation = transform.localRotation;

             //Kobayashi:Reference for "SpringManager" component with unitychan

             // GameObject.Find("unitychan_dynamic").GetComponent<SpringManager>();

             managerRef = GetParentSpringManager (transform);

         }

         private SpringManager GetParentSpringManager (Transform t)

         {

             var springManager = t.GetComponent<SpringManager> ();

             if (springManager != null)

                 return springManager;

             if (t.parent != null) {

                 return GetParentSpringManager (t.parent);

             }

             return null;

         }

         private void Start ()

         {

             springLength = Vector3.Distance (trs.position, child.position);

             currTipPos = child.position;

             prevTipPos = child.position;

         }

         public void UpdateSpring ()

         {

             //Kobayashi

             org = trs;

             //回転をリセット

             trs.localRotation = Quaternion.identity * localRotation;

             float sqrDt = Time.deltaTime * Time.deltaTime;

             //stiffness

             Vector3 force = trs.rotation * (boneAxis * stiffnessForce) / sqrDt;

             //drag

             force += (prevTipPos - currTipPos) * dragForce / sqrDt;

             force += springForce / sqrDt;

             //前フレームと値が同じにならないように

             Vector3 temp = currTipPos;

             //verlet

             currTipPos = (currTipPos - prevTipPos) + currTipPos + (force * sqrDt);

             //長さを元に戻す

             currTipPos = ((currTipPos - trs.position).normalized * springLength) + trs.position;

             //衝突判定

             for (int i = ; i < colliders.Length; i++) {

                 if (Vector3.Distance (currTipPos, colliders [i].transform.position) <= (radius + colliders [i].radius)) {

                     Vector3 normal = (currTipPos - colliders [i].transform.position).normalized;

                     currTipPos = colliders [i].transform.position + (normal * (radius + colliders [i].radius));

                     currTipPos = ((currTipPos - trs.position).normalized * springLength) + trs.position;

                 }

             }

             prevTipPos = temp;

             //回転を適用;

             Vector3 aimVector = trs.TransformDirection (boneAxis);

             Quaternion aimRotation = Quaternion.FromToRotation (aimVector, currTipPos - trs.position);

             //original

             //trs.rotation = aimRotation * trs.rotation;

             //Kobayahsi:Lerp with mixWeight

             Quaternion secondaryRotation = aimRotation * trs.rotation;

             trs.rotation = Quaternion.Lerp (org.rotation, secondaryRotation, managerRef.dynamicRatio);

         }

         private void OnDrawGizmos ()

         {

             if (debug) {

                 Gizmos.color = Color.yellow;

                 Gizmos.DrawWireSphere (currTipPos, radius);

             }

         }

     }

 }

SpringBone.cs

 //

 //SpingManager.cs for unity-chan!

 //

 //Original Script is here:

 //ricopin / SpingManager.cs

 //Rocket Jump : http://rocketjump.skr.jp/unity3d/109/

 //https://twitter.com/ricopin416

 //

 //Revised by N.Kobayashi 2014/06/24

 //           Y.Ebata

 //

 using UnityEngine;

 using System.Collections;

 namespace UnityChan

 {

     public class SpringManager : MonoBehaviour

     {

         //Kobayashi

         // DynamicRatio is paramater for activated level of dynamic animation 

         public float dynamicRatio = 1.0f;

         //Ebata

         public float            stiffnessForce;

         public AnimationCurve    stiffnessCurve;

         public float            dragForce;

         public AnimationCurve    dragCurve;

         public SpringBone[] springBones;

         void Start ()

         {

             UpdateParameters ();

         }

         void Update ()

         {

 #if UNITY_EDITOR

         //Kobayashi

         if(dynamicRatio >= 1.0f)

             dynamicRatio = 1.0f;

         else if(dynamicRatio <= 0.0f)

             dynamicRatio = 0.0f;

         //Ebata

         UpdateParameters();

 #endif

         }

         private void LateUpdate ()

         {

             //Kobayashi

             if (dynamicRatio != 0.0f) {

                 for (int i = ; i < springBones.Length; i++) {

                     if (dynamicRatio > springBones [i].threshold) {

                         springBones [i].UpdateSpring ();

                     }

                 }

             }

         }

         private void UpdateParameters ()

         {

             UpdateParameter ("stiffnessForce", stiffnessForce, stiffnessCurve);

             UpdateParameter ("dragForce", dragForce, dragCurve);

         }

         private void UpdateParameter (string fieldName, float baseValue, AnimationCurve curve)

         {

             var start = curve.keys [].time;

             var end = curve.keys [curve.length - ].time;

             //var step    = (end - start) / (springBones.Length - 1);

             var prop = springBones [].GetType ().GetField (fieldName, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);

             for (int i = ; i < springBones.Length; i++) {

                 //Kobayashi

                 if (!springBones [i].isUseEachBoneForceSettings) {

                     var scale = curve.Evaluate (start + (end - start) * i / (springBones.Length - ));

                     prop.SetValue (springBones [i], baseValue * scale);

                 }

             }

         }

     }

 }

SpingManager.cs

最新文章

  1. python 多态
  2. c语言笔试题
  3. ESRI.ArcGIS.esriSystem名称空间问题
  4. Android SDK Manager 在win8.1上的闪退问题
  5. Debug不崩溃Release版本崩溃的一种原因
  6. Phonebook 导入SD上的.vcf联系人
  7. Java实现Socket之TimeClient
  8. String StringBuilder以及StringBuffer
  9. event事件:
  10. ubuntu12.04安装搜狗输入法配置,安装packettracer字体设置,软件推荐
  11. React之key详解
  12. mysql 多列索引的生效规则
  13. PHP 实例 AJAX 与 MySQL
  14. Spark-SQL之DataFrame操作大全
  15. 构建DHCP服务
  16. 本机无法访问虚拟机里面的nginx的80端口
  17. CSS3注意点
  18. AngularJS中自定义过滤器
  19. linux shell 命令常用快捷键
  20. Java通过匿名类来实现回调函数

热门文章

  1. jQuery开发入门
  2. 20145230java实验报告二
  3. linux下安装LAMP环境,也就是PHP+linux的开发运行环境(centos7)
  4. shell中嵌套执行expect命令实例(利用expect实现自动登录)
  5. 【P2361】yyy棋(博弈论+贪心+模拟)
  6. 【BZOJ2818】Gcd (欧拉函数)
  7. mysql创建定时执行存储过程任务实现订单定时关闭
  8. [转载]解析 Java 类和对象的初始化过程
  9. html5 frameset5内嵌框架集
  10. mybatis中&amp;gt;=和&amp;lt;=的实现方式