unitychan-crs 头发随动脚本
//
//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 头发随动脚本的更多相关文章
- Unity 头发随动效果
目标 实现角色的衣袖.头发.裙摆.披风.尾巴等,在角色运动时,可以产生随动的效果.类似王者荣耀角色展示界面. 准备 源码出出处:https://github.com/unity3d-jp/unityc ...
- linux-启动脚本-souce与sh
source: 在当前shell程序中执行, 因此当前shell程序中的变量和环境变量,均可见. 执行的脚本,能更新到当前shell程序. sh: 开启一个新 ...
- Seaweedfs-启动脚本
#!/bin/bash if [ ! -e /sunlight/shell/main.sh ];then echo " [ Error ] file /sunlight/shell/main ...
- Tomcat8-启动脚本分析
1. Tomcat也是一个java程序 最终的入口启动文件:org.apache.catalina.startup.Bootstrap 最后一条命令: start "Tomcat" ...
- NGUI学习笔记(五):缓动
在Unity3D中可以使用自带的Animation制作任意形式的动画,不过我们这篇笔记主要是学习和使用NGUI提供的Tween动画.NGUI提供的Tween库功能较为简单,主要是用来实现NGUI自身需 ...
- Linux 设备模型浅析之 uevent 篇(2)
Linux 设备模型浅析之 uevent 篇 本文属本人原创,欢迎转载,转载请注明出处.由于个人的见识和能力有限,不可能面 面俱到,也可能存在谬误,敬请网友指出,本人的邮箱是 yzq.seen@gma ...
- 关于Redis的知识汇总[转]
1. Overview 1.1 资料 <The Little Redis Book> ,最好的入门小册子,可以先于一切文档之前看,免费. 作者Antirez的博客,Antirez维护的Re ...
- android udev
http://www.freesoftwaremagazine.com/articles/drivers_linux http://blog.csdn.net/jianchi88/article/de ...
- mysql报错排查总结
mysql报错: [root@zabbix ~]# mysql ERROR 2002 (HY000): Can't connect to local MySQL server through sock ...
随机推荐
- 优化MD5和IP在(MySQL)数据库中的存储
1.MD5在MySQL数据库中的存储 用CHAR(32)来存储MD5值是一个常见的技巧.如果你的应用程序使用VARCHAR(32),则对每个值得字符串长度都需要花费额外的不 必要的开销.这个十六进制的 ...
- React Native中组件的props和state
一.组件的属性(props)和状态(state) 1.属性(props) 它是组件的不可变属性(组件自己不可以自己修改props). 组件自身定义了一组props作为对外提供的接口,展示一个组件时只需 ...
- .NET自带泛型委托方法Func、Action和Predicate
Func.Action和Predicate是.NET自带的3个泛型委托方法,三个方法的区别其实并不大,要强行给混着用也是可以的,但是我们是有追求的人,把道理讲清楚总是好的. 一.Func是有返回值的方 ...
- python中threading多线程
python中有两个处理多线程的模块thread和threading.其中thread提供了多线程底层支持的模块,以低级原始的发那个是来处理和控制线程,使用起来较为复杂:而threading基于thr ...
- FreeMarker 使用实例
以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... - ...
- jupyter && ipython notebook简介
2017-08-19 最近用了一下 ipython notebook 也就是 jupyter,这里有一个介绍还不错: http://www.cnblogs.com/howiewang/p/jupyte ...
- 为什么原生的servlet是线程不安全的而Struts2是线程安全的?
因为原生的servlet在整个application生命周期中,只在初次访问的时候实例化一次,以后都不会再实例化,只会调用Server方法进行响应,所以如果在servlet类中定义成员变量,那么就会让 ...
- mysql基础(4)-数据导入
如何把数据导入(出)mysql 导出 sql语句 select * from 表名 into outfile "详细路径" fields terminated by ...
- Linux嵌入式 -- 内核 - 进程控制 和 调度
1. 进程四要素 1. 有一段程序供其执行.这段程序不一定是某个进程所专有,可以与其他进程共用. 2. 有进程专用的内核空间堆栈. 3. 在内核中有一个task_struct数据结构,即通常所说的&q ...
- Thinkpad E440个性化设置:如何/禁用关闭触摸板?
#如何禁用/关闭触摸版 默认情况下,ThinkPad E440是不支持触摸板的关闭功能,如果要关闭的话,需要去官方下载相应的鼠标驱动 UltraNav. 下载地址:http://think.lenov ...