using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Playables; public class Player : MonoBehaviour { private Animator anim;
//private int speedID = Animator.StringToHash("Speed"); //走
//private int isSpeedUPID = Animator.StringToHash("isSpeedUP"); //跑
//private int turnAroundID = Animator.StringToHash("TurnAround"); //转向 private int speedRotateID = Animator.StringToHash("SpeedRotate");
private int speedZID = Animator.StringToHash("SpeedZ"); private int isHoldLogID = Animator.StringToHash("isHoldLog");
private int slideID = Animator.StringToHash("Slide");
private int vaultID = Animator.StringToHash("Vault");
private Vector3 matchTarget = Vector3.zero; private CharacterController characterController;
private int colliderID = Animator.StringToHash("Collider"); public GameObject unityLog = null; //角色身上的木头
public Transform rightHand; //木头左右边的节点(空的gameobject)
public Transform leftHand;
public PlayableDirector playable; // Use this for initialization
void Start () {
anim = GetComponent<Animator>();
characterController = GetComponent<CharacterController>();
//unityLog = transform.Find("Reference/Hips/Unity_Log (1)").gameObject; //找到Log
} // Update is called once per frame
void Update () {
//2D混合树控制移动和旋转
anim.SetFloat(speedZID, Input.GetAxis("Vertical") * 4.1f);
anim.SetFloat(speedRotateID, Input.GetAxis("Horizontal") * 126f); ProcessVault();
ProcessSlide();
//if(anim.GetFloat(colliderID)>0.5f)
//{
// characterController.enabled = false;
//}
//else
//{
// characterController.enabled = true;
//}
//上面判断语句的简写
//滑动或翻墙时禁用角色控制器
characterController.enabled = anim.GetFloat(colliderID) < 0.05f; //走
//anim.SetFloat(speedID, Input.GetAxis("Vertical")*4.1f); ////转向
//anim.SetFloat(turnAroundID, Input.GetAxis("Horizontal"));
////跑
//if(Input.GetKeyDown(KeyCode.LeftShift))
//{
// anim.SetBool(isSpeedUPID, true);
//}
//if (Input.GetKeyUp(KeyCode.LeftShift))
//{
// anim.SetBool(isSpeedUPID, false);
//} } //翻墙
private void ProcessVault()
{
//翻墙
bool isVault = false;
//当Animator状态机在混合树“Motion”时判断,节省性能
if (anim.GetFloat(speedZID) > && anim.GetCurrentAnimatorStateInfo().IsName("Motion"))
{
RaycastHit hit;
if (Physics.Raycast(transform.position + Vector3.up * 0.3f, transform.forward, out hit, 4f))
{
if (hit.collider.tag == "Obstacle")
{
if (hit.distance > )
{
Vector3 point = hit.point;
//设定匹配位置
point.y = hit.collider.transform.position.y + hit.collider.bounds.size.y + 0.05f;
matchTarget = point;
isVault = true;
} }
}
}
anim.SetBool(vaultID, isVault); //匹配跳跃过程中左手与墙面的位置
if (anim.GetCurrentAnimatorStateInfo().IsName("Vault"))
{
anim.MatchTarget(matchTarget, Quaternion.identity, AvatarTarget.LeftHand, new MatchTargetWeightMask(Vector3.one, ), 0.32f, 0.4f);
} } //滑
private void ProcessSlide()
{
bool isSlide = false;
if (anim.GetFloat(speedZID) > && anim.GetCurrentAnimatorStateInfo().IsName("Motion"))
{
RaycastHit hit;
if (Physics.Raycast(transform.position + Vector3.up * 1.5f, transform.forward, out hit, 3f))
{
if (hit.collider.tag == "Obstacle")
{
if (hit.distance > )
{
Vector3 point = hit.point;
point.y = ;
matchTarget = point + transform.forward * ;
isSlide = true;
}
}
}
}
anim.SetBool(slideID,isSlide);
if (anim.GetCurrentAnimatorStateInfo().IsName("Slide"))
{
anim.MatchTarget(matchTarget, Quaternion.identity, AvatarTarget.Root, new MatchTargetWeightMask(new Vector3(,,), ), 0.17f, 0.67f);
}
} //检测碰撞
private void OnTriggerEnter(Collider other)
{
//木头
if(other.tag=="Log")
{
Destroy(other.gameObject);
CarryWood();
}
//镜头
if(other.tag=="Playable")
{
playable.Play();
}
} //扛木头
void CarryWood()
{
unityLog.SetActive(true);
anim.SetBool(isHoldLogID, true);
} //设置左右手IK到相应节点
//每帧都调用
private void OnAnimatorIK(int layerIndex)
{
//当layer层级为HoldLog
if(layerIndex==)
{
int weight = anim.GetBool(isHoldLogID) ? : ;
//左手
anim.SetIKPosition(AvatarIKGoal.LeftHand, leftHand.position);
anim.SetIKRotation(AvatarIKGoal.LeftHand, leftHand.rotation);
anim.SetIKPositionWeight(AvatarIKGoal.LeftHand, weight); //IK权重
anim.SetIKRotationWeight(AvatarIKGoal.LeftHand, weight); //右手
anim.SetIKPosition(AvatarIKGoal.RightHand, rightHand.position);
anim.SetIKRotation(AvatarIKGoal.RightHand, rightHand.rotation);
anim.SetIKPositionWeight(AvatarIKGoal.RightHand, weight);
anim.SetIKRotationWeight(AvatarIKGoal.RightHand, weight);
}
}
}

Player

Rig:

动画类型分为三类

1.Legacy:老版本的动画系统,一般都是单独做好的

2.Generic:骨骼动画,一般用在非人型生物上

3.Humanoid:骨骼动画,一般可通用在人形模型上面,只要骨骼节点设置相同

       如果有些人物模型带有骨骼但是无法通用可选择:Create Form This Model -> Apply一下

       ->点击configure进行编辑确认后保存退出看下能不能用

Animation:

可进行动画的剪切与播放设置

1.Loop Pose让动画循环播放时衔接更顺滑(猜测是通过动画曲线开始与结束时的的陡峭程度进行插值运算)

2.Root Transform 下面的Bake into Pose勾选后动画播放后的位置就会被固定(有些动画播放时会有位移和转向)

3.Curves:设置曲线值,并且可以在Animator编辑器中添加相同名称的Parameters来控制触发条件

Animator状态机:

1.可以把动画拖进去设置然后通过相应的状态连接起来(点击连接箭头后如右边Inspector显示)

    (1)Has Exit Time是否等当前动画播放完才跳转到下一个

    (2)Conditions里可以设置Parameter里添加的各种条件参数

Blend Tree混合树:

在Animator里的BaseLayer层右键单击选择Creat State -> From New Blend Tree

如右边面板所示  (1)可选择1D/2D等混合树类型

          (2)可以添加各个动画然后在图中拖动摆放各个动画并观察相互间的影响范围,也可以通过Compute Positions来按照特定条件计算摆放

 

AvatorMask:

通过Project中的Create -> AvatorMask创建

如图可以设置各个部位与Ik的禁用

通过新建一个Layer层设置Weight权重,Mask,Blending混合类型等可以在主动画播放时控制另一个动画也播放

如图中设置就能使第一个Layers里的动画播放时,第二个Layers动画中手部的动画状态覆盖掉第一个动画

(也就是说原本第一层动画是跑动时的动作(手会摆动),而第二层动画是原地站立举手的动作,如图中设置后就变成跑动时举手的动作了)

Timeline:

功能有点类似于视频编辑软件,主要通过Playable Director组件来控制

把相应的动画,物体,声音等直接拖入会显示创建类型,或者右键单击也可以看到有哪些类型可创建

1.可通过点击红色圆点进行动画的录制(改变position与rotation等)

2.右键单击相应轨道选择Add From Animation Clip可以生成模块,然后就能随意的拖动摆放或缩放播放内容了

点击相应的模块后可在inspector面板进行设置

1.Pre/Post - Extrapolate可以设置动画播放前/后的状态(暂时未发现这些设置对Post有何作用,因此那个“结束后”待定)

  (1)None:在开始前/结束后,无,物体原始位置都会被设置为(0,0,0),动画开始的默认状态也不会有(以带有骨骼动画的人物为例,不会站立等,而是变成骨骼动画设置里的Muscle&Setting状态(苟起来)),直到播放动画为止

  (2)Hold:在开始前/结束后,保持动画起始时的状态,直到播放动画为止

  (3)Loop:同上,循环播放(起点 -> 终点, 起点 -> 终点。。这样一个状态),同上

  (4)PingPong:同上,和循环对比的区别就是(起点 -> 终点 ->起点这一过程,不会瞬移),同上

  (5)Continue:同上,在播放前会把动画播放一边然后一直等待到动画播放为止,如果动画前面部分被缩减掉一点,当放到此动画时依然会播放完整

Animator & Timeline的更多相关文章

  1. Unity User Group深圳站——Timeline & Cinemachine分享

    报名说明:UUG深圳站,2月分享活动正式启动,1月29日中午12:00前报名可获赠Unity精美纪念礼物一份~ 关于Unity Unity 是一款多平台的综合型游戏开发工具,它的出现对蓬勃发展的全球游 ...

  2. Timeline高级扩展

    转载于http://forum.china.unity3d.com/thread-32200-1-1.html通过demo讲解了timeline更加复杂的使用方式 Timeline是创建过场动画和影片 ...

  3. Timeline扩展功能实践指南

    转载于http://forum.china.unity3d.com/forum.php?mod=viewthread&tid=32842,介绍了timeline的轨道扩展 Timeline功能 ...

  4. timeline bugs

    timeline有个问题巨坑 修了很久 就是一个track控制character的position 另一个track控制同一个character的animaion 拖一段现成的动画进去 这种情况 会有 ...

  5. Chrome Developer Tools:Timeline Panel说明

    一.Timeline panel 概况 Timeline工具栏可以详细检测出Web应用在加载过程中,时间花费情况的概览.这些应用包括下载资源,处理DOM事件, 页面布局渲染或者向屏幕绘制元素. 如下图 ...

  6. Animator Controller 继承关系

    准备知识 对于Animator Controller中蜘蛛网一样的几十条连线,后续如果靠人工维护,那成本将是很大. AnimatorOverrideController组件的文档:https://do ...

  7. Unity Animator动画状态机 深入理解(二)IK控制

    IK还是一个很神奇和实用的东西啊,起码可以用代码来控制人物骨骼位置还是很爽的.因为不是动画师~ 这篇可能跟Animator没啥关系了哈,都是代码层的. 看了一官方的案例,老的,有些问题,自己修改了一下 ...

  8. Unity Animator动画状态机 深入理解(一)

    接触Unity以来就已经有了Animator,Animation用的少,不过也大概理解他俩之间的一个区别于联系. 图中其实就是Animator和Animation之间的区别于联系了,啊!你肯定会告诉我 ...

  9. Chrome 开发工具之Timeline

    之前有说到Element,Console,Sources大多运用于debug,Network可用于debug和查看性能,今天的主角Timeline更多的是用在性能优化方面,它的作用就是记录与分析应用程 ...

随机推荐

  1. Java java httpclient4.5 进行http,https通过SSL安全验证跳过,封装接口请求 get,post(formdata,json)封装,文件上传下载

    package api; import java.util.*; import java.net.URI; import org.apache.http.Consts; import org.apac ...

  2. [转]SQL Server 数据库中的 MD5 和 SHA1

    MD5 和 SHA1 是一种单向加密算法,常用于密码的验证等需要加密操作的场合,在一般情况下,开发人员可以通过 Delphi 或 PHP 这类语言自己编写相关函数或者使用自带的函数,然后将加密过的结果 ...

  3. EF Core 2.1 Raw SQL Queries (转自MSDN)

    Entity Framework Core allows you to drop down to raw SQL queries when working with a relational data ...

  4. Linux本地数据上传到阿里云OSS

    这篇文章主要是介绍如何将服务器本地的数据上传到阿里云OSS的指定bucket中,最重要的参考文档是数据迁移单机部署.我第一次上传数据到OSS上时,步骤要比前面的链接中介绍的要麻烦,ossimport工 ...

  5. What to do next to activate this settings for already existing users

    Link: http://sharepoint.stackexchange.com/questions/89284/sharepoint-2013-mysite-increase-quota Cent ...

  6. docker 容器不能访问宿主端口原因

    因为数据包到了eth0的 上的iptables 表,首先匹配PREROUTING 链,这个拒绝了来自docker0的流量,从而跳到input链,input没有放开服务端口,所以容器访问宿主端口失败;但 ...

  7. 【腾讯敏捷转型No.2】帅哥,来多少敏捷?

    上回腾讯敏捷转型系列第一篇文章<敏捷到底是什么鬼?>讲到公司铁了心要推进敏捷,这是战略层面的决定,为什么呢? 当时的我们并不知道公司为什么一定要推行敏捷的新概念,但是后来公司的变化帮助我们 ...

  8. 12c数据库重启后自动启动pdb

    由于最近管理12c数据库,创建了9个新的pdb.相对于以前11g版本每天一个一个的环境检查,方便了很多. 但是因为一次意外宕机,数据库重启.虽然数据库重启,但是管理的pdb确不能自动重启,所以需要手动 ...

  9. Objective-C基础知识之“类”

    Objective-C语言是iOS开发的专用语言,虽然现在在逐步被swift语言取代,但是仍可以作为基础学习,学会Objective-C之后入手swift也是相当快速.今天我来简谈一下关于OC中的类. ...

  10. 01.centos7环境准备

    博客为日常工作学习积累总结: 1.环境准备: 系统版本:CentOS-7-x86_64-Minimal-1810.iso 运行环境:虚拟机windows上的VM 15 系统安装:参照老男孩运维要求 2 ...