//

 //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. springboot获取URL请求参数的几种方法

    原文地址:http://www.cnblogs.com/xiaoxi/p/5695783.html 1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于pos ...

  2. com.android.dex.DexIndexOverflowException: Cannot merge new index 66299 into a non-jumbo instruction

    打包时控制台输出: Error:Execution failed for task ':app:transformClassesWithDexForAll32Release'. > com.an ...

  3. INSPIRED启示录 读书笔记 - 第31章 苹果公司给我的启示

    苹果公司值得学习的经验 1.硬件为软件服务:苹果公司明白硬件必须为软件服务,软件直接服务用户,满足用户需求.采用多点触控显示屏.重力加速器.距离传感器这些硬件技术是为了配合软件满足用户需求 2.软件为 ...

  4. Cgroups控制cpu,内存,io示例【转】

    本文转载自:https://www.cnblogs.com/yanghuahui/p/3751826.html 百度私有PaaS云就是使用轻量的cgoups做的应用之间的隔离,以下是关于百度架构师许立 ...

  5. Kubernetes Controller Manager

    Controller Manager 作为集群内部的管理控制中心,负责集群内的Node.Pod副本.Service Endpoint.NameSpace.ServiceAccount.Resource ...

  6. maven创建web工程Spring配置文件找不到

    使用maven创建web工程,将Spring配置文件applicationContext.xml放在src/resource下,用eclipse编译时提示class path resource [ap ...

  7. springcloud-搭建服务注册中心

    创建服务注册中心 1.创建一个springboot 命名为eureka-server 1)添加Eureka依赖 pom.xml <?xml version="1.0" enc ...

  8. Excel 如何复制粘贴一整行

    在某些时候,我们需要重复性的录入一些信息,而且表头都是一样的,一直拉列宽是相当令人烦躁的事情. 所以,就想可以直接复制黏贴出一整行,包括行的各个列宽. 具体操作如图: ——>首先,一整行复制, ...

  9. Microsoft MVC3 框架

             1. 安装MVC3框架 官网:http://www.asp.net/mvc 下载:ASP.NET MVC3 with Tools http://go.microsoft.com/fw ...

  10. iTerm2 + Oh My Zsh

    iTerm2 http://iterm2.com/downloads.html https://iterm2.com/downloads/stable/iTerm2-2_1_4.zip Oh My Z ...