//

 //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. 每天一个Linux命令(46)ifconfig命令

    在windows系统中,ipconfig命令行工具被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).     ( ...

  2. RAID 工作模式

    RAID 工作模式 RAID磁盘阵列 优点: 1.提高传输速率:RAID通过在多个磁盘上同时存储和读取数据来大幅提高存储系统的数据吞吐量. 2.RAID可以达到单个磁盘驱动器几倍.几十倍甚至上百倍的速 ...

  3. 主攻ASP.NET MVC4.0之重生:Jquery Mobile 按钮+对话框使用

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. SQLite3时间函数小结

    import sqlite3 conn = sqlite3.connect('/tmp/sqlite.db') cur = conn.cursor() 接下来干嘛呢?建一张表吧.这里需要注意的是,SQ ...

  5. 监控pbs运行状况

    # 监控内存使用情况 job_id=163997workdir=/share_bio/echo "population_sizes" >> $workdir/pbs/p ...

  6. 【P1947】笨笨当粉刷匠(DP+前缀和)

    这个题乍一看觉得挺简单的,事实上却完全不是.首先,这个题看上去无脑直接刷就可以然而因为刷的次数远远大于木板的个数所以不行,然后开始考虑DP,自己一开始是这么想的,如果用f[t][i][j]表示刷t次时 ...

  7. nginx 反向代理配置之---可配置多域名请求

    配置文件如下: server { listen 80; server_name ngin服务器所对应的的域名; error_log /data/logs/nginx/mainsite.error.lo ...

  8. 集群环境ssh免密码登录设置

    一.准备工作 1) 用客户端工具(ssh client或者putty)连接到linux服务器.在root用户下输入命令 vi /etc/hosts,用vi编辑hosts文件,如下: #127.0.0. ...

  9. release与debug的区别

    http://www.cnblogs.com/JemBai/archive/2009/01/13/1374805.html

  10. 返回结果的HTTP状态码

    HTTP状态码的职责是当客户端向服务器发送请求时,描述返回的请求结果. 2xx成功 2xx的响应结果表明请求被正常处理. 200 OK 请求已正常处理 204 No Content 请求处理成功,但是 ...