//

 //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

unitychan-crs 头发随动脚本的更多相关文章

  1. Unity 头发随动效果

    目标 实现角色的衣袖.头发.裙摆.披风.尾巴等,在角色运动时,可以产生随动的效果.类似王者荣耀角色展示界面. 准备 源码出出处:https://github.com/unity3d-jp/unityc ...

  2. linux-启动脚本-souce与sh

    source:        在当前shell程序中执行,  因此当前shell程序中的变量和环境变量,均可见.   执行的脚本,能更新到当前shell程序. sh:            开启一个新 ...

  3. Seaweedfs-启动脚本

    #!/bin/bash if [ ! -e /sunlight/shell/main.sh ];then echo " [ Error ] file /sunlight/shell/main ...

  4. Tomcat8-启动脚本分析

    1. Tomcat也是一个java程序 最终的入口启动文件:org.apache.catalina.startup.Bootstrap 最后一条命令: start "Tomcat" ...

  5. NGUI学习笔记(五):缓动

    在Unity3D中可以使用自带的Animation制作任意形式的动画,不过我们这篇笔记主要是学习和使用NGUI提供的Tween动画.NGUI提供的Tween库功能较为简单,主要是用来实现NGUI自身需 ...

  6. Linux 设备模型浅析之 uevent 篇(2)

    Linux 设备模型浅析之 uevent 篇 本文属本人原创,欢迎转载,转载请注明出处.由于个人的见识和能力有限,不可能面 面俱到,也可能存在谬误,敬请网友指出,本人的邮箱是 yzq.seen@gma ...

  7. 关于Redis的知识汇总[转]

    1. Overview 1.1 资料 <The Little Redis Book> ,最好的入门小册子,可以先于一切文档之前看,免费. 作者Antirez的博客,Antirez维护的Re ...

  8. android udev

    http://www.freesoftwaremagazine.com/articles/drivers_linux http://blog.csdn.net/jianchi88/article/de ...

  9. mysql报错排查总结

    mysql报错: [root@zabbix ~]# mysql ERROR 2002 (HY000): Can't connect to local MySQL server through sock ...

随机推荐

  1. css小技巧1

    资料 1. 文本省略 单行省略: white-space:nowrap; overflow:hidden; text-overflow:ellipsis; 多行文本省略: 只兼容webkit内核,不属 ...

  2. Android开发BUG及解决方法

    错误描述 问题1: 按照提示打开gradle-wrapper.properties文件 并且将gradle-2.8-all.zip改为gradle-2.10-all.zip,重新导入项目 问题2: 却 ...

  3. STP生成树协议原理与算法解析

    转:https://wenku.baidu.com/view/2e52b91d866fb84ae45c8d34.html

  4. 跨平台移动开发 Xuijs超轻量级的框架 Dom与Event简洁代码实现文本展开收起

    Dom与Event简洁代码实现文本展开收起 Xuijs超轻量级的框架 Dom与Event实现文本展开收起 效果图 示例代码 <!DOCTYPE html PUBLIC "-//W3C/ ...

  5. 关于Pytorch的二维tensor的gather和scatter_操作用法分析

    看得不明不白(我在下一篇中写了如何理解gather的用法) gather是一个比较复杂的操作,对一个2维tensor,输出的每个元素如下: out[i][j] = input[index[i][j]] ...

  6. 使用Navicat连接oracle时出现unsupported server character set ZHS16GBK的解决之道

    原文网址http://blog.mn886.net/chenjianhua/show/ba1dc6f835be403ea159b0a5e2685ff2/index.html ORA-12737:Ins ...

  7. tensorFlow 神经网络2

    learnrate 太大容易跑飞,设置激活函数 可以一定程度上增加learnrate,不跑飞 self.saver = tf.train.Saver() 和 self.init_variable = ...

  8. HBase学习2(HBase shell)

    HBase 常用命令 查看当前用户:whoami 创建表:create '表名', '列族名1','列族名2','列族名N' 查看所有表:list 描述表: describe '表名' 判断表存在: ...

  9. session共享个人小结

    一.需求问题: 如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢? 这个时候会话id在客户端是没有问题的, 但是如果用 ...

  10. JavaWeb -- JSP+JavaBean模式

    SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. JSP+JavaBean模式适合开发业务 ...