unitychan-crs 头发随动脚本
2024-09-02 17:45:15
// //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
最新文章
- python 多态
- c语言笔试题
- ESRI.ArcGIS.esriSystem名称空间问题
- Android SDK Manager 在win8.1上的闪退问题
- Debug不崩溃Release版本崩溃的一种原因
- Phonebook 导入SD上的.vcf联系人
- Java实现Socket之TimeClient
- String StringBuilder以及StringBuffer
- event事件:
- ubuntu12.04安装搜狗输入法配置,安装packettracer字体设置,软件推荐
- React之key详解
- mysql 多列索引的生效规则
- PHP 实例 AJAX 与 MySQL
- Spark-SQL之DataFrame操作大全
- 构建DHCP服务
- 本机无法访问虚拟机里面的nginx的80端口
- CSS3注意点
- AngularJS中自定义过滤器
- linux shell 命令常用快捷键
- Java通过匿名类来实现回调函数
热门文章
- jQuery开发入门
- 20145230java实验报告二
- linux下安装LAMP环境,也就是PHP+linux的开发运行环境(centos7)
- shell中嵌套执行expect命令实例(利用expect实现自动登录)
- 【P2361】yyy棋(博弈论+贪心+模拟)
- 【BZOJ2818】Gcd (欧拉函数)
- mysql创建定时执行存储过程任务实现订单定时关闭
- [转载]解析 Java 类和对象的初始化过程
- html5 frameset5内嵌框架集
- mybatis中&;gt;=和&;lt;=的实现方式