Unity动画系统(4)

6.3 动画系统高级1-1_哔哩哔哩_bilibili

p333-

声音组件添加

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class RobotAnimationController : MonoBehaviour

{

[Header("平滑过渡时间")]

[Range(0,3)]

public float dampTime = 3f;

[Header("移动速度")]

public float speed = 3f;

[Header("转身速度")]

public float turnSpeed = 10f;

//虚拟轴

private float hor, ver;

//动画组件

private Animator ani;

//声音组件

private AudioSource aud;

//虚拟按键

private bool sneak;

private void Awake()

{

ani = GetComponent<Animator>();

aud = GetComponent<AudioSource>();

}

private void Update()

{

hor = Input.GetAxis("Horizontal");

ver = Input.GetAxis("Vertical");

//获取虚拟按键

sneak = Input.GetButton("Sneak");

//if (sneak) {

// ani.SetBool("Sneak", sneak);

//}

//设置动画参数

ani.SetBool("Sneak", sneak);

//只要按下一个方向键,就走

if (hor != 0 || ver != 0)

{

//设置Speed,角色动起来

ani.SetFloat("Speed", 5.6f, dampTime, Time.deltaTime);

//将向量转换成四元数

Quaternion targetQua = Quaternion.LookRotation(new Vector3(hor, 0, ver));

//lerp过去

transform.rotation = Quaternion.Lerp(transform.rotation, targetQua, Time.deltaTime * turnSpeed);

}

else {

//停下来

ani.SetFloat("Speed", 0f);

}

//判断当前是否是Locomotion状态

bool isLocomotion=ani.GetCurrentAnimatorStateInfo(0).IsName("Locomotion");

if (isLocomotion)

{

//判断脚步声音是不是已经开始播放了

if (!aud.isPlaying) {

//播放声音

aud.Play();

}

}

else {

//停止声音

aud.Stop();

}

}

}

边走路边喊叫 动画分层的应用

Mask

模型正对我们

非人型遮罩------手动勾选

override覆盖上一层的动画

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class RobotController : MonoBehaviour

{

[Header("平滑过渡时间")]

[Range(0, 3)]

public float dampTime = 3f;

[Header("移动速度")]

public float speed = 3f;

[Header("转身速度")]

public float turnSpeed = 10f;

//虚拟轴

private float hor, ver;

//动画组件

private Animator ani;

//声音组件

private AudioSource aud;

[Header("喊叫声音片段")]

public AudioClip shoutClip;

//虚拟按键

private bool sneak,shout;

private void Awake()

{

ani = GetComponent<Animator>();

aud = GetComponent<AudioSource>();

}

private void Update()

{

hor = Input.GetAxis("Horizontal");

ver = Input.GetAxis("Vertical");

//获取虚拟按键

sneak = Input.GetButton("Sneak");

shout = Input.GetButtonDown("Shout");

//if (sneak) {

// ani.SetBool("Sneak", sneak);

//}

//设置动画参数

ani.SetBool("Sneak", sneak);

if (shout) {

//触发参数shout

ani.SetTrigger("Shout");

//播放喊叫声音

AudioSource.PlayClipAtPoint(shoutClip,transform.position);

}

//只要按下一个方向键,就走

if (hor != 0 || ver != 0)

{

//设置Speed,角色动起来

ani.SetFloat("Speed", 5.6f, dampTime, Time.deltaTime);

//将向量转换成四元数

Quaternion targetQua = Quaternion.LookRotation(new Vector3(hor, 0, ver));

//lerp过去

transform.rotation = Quaternion.Lerp(transform.rotation, targetQua, Time.deltaTime * turnSpeed);

}

else

{

//停下来

ani.SetFloat("Speed", 0f);

}

//判断当前是否是Locomotion状态

bool isLocomotion = ani.GetCurrentAnimatorStateInfo(0).IsName("Locomotion");

if (isLocomotion)

{

//判断脚步声音是不是已经开始播放了

if (!aud.isPlaying)

{

//播放声音

aud.Play();

}

}

else

{

//停止声音

aud.Stop();

}

}

}

AudioListener挂载在角色身上

参数不能超过1个

IK方向动力学

Inverse kinematics

反应的是一种由手部带到肩部的运动形式,在这个运动中,运动以手部这个自由端为起始,当手部进行运动时会自然的带动固定端肩部的运动。

比如别人拉起你的手

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class RobotController : MonoBehaviour

{

[Header("平滑过渡时间")]

[Range(0, 3)]

public float dampTime = 3f;

[Header("移动速度")]

public float speed = 3f;

[Header("转身速度")]

public float turnSpeed = 10f;

//虚拟轴

private float hor, ver;

//动画组件

private Animator ani;

//声音组件

private AudioSource aud;

[Header("喊叫声音片段")]

public AudioClip shoutClip;

//虚拟按键

private bool sneak,shout;

private void Awake()

{

ani = GetComponent<Animator>();

aud = GetComponent<AudioSource>();

}

private void Update()

{

hor = Input.GetAxis("Horizontal");

ver = Input.GetAxis("Vertical");

//获取虚拟按键

sneak = Input.GetButton("Sneak");

shout = Input.GetButtonDown("Shout");

//if (sneak) {

// ani.SetBool("Sneak", sneak);

//}

//设置动画参数

ani.SetBool("Sneak", sneak);

if (shout) {

//触发参数shout

ani.SetTrigger("Shout");

}

//只要按下一个方向键,就走

if (hor != 0 || ver != 0)

{

//设置Speed,角色动起来

ani.SetFloat("Speed", 5.6f, dampTime, Time.deltaTime);

//将向量转换成四元数

Quaternion targetQua = Quaternion.LookRotation(new Vector3(hor, 0, ver));

//lerp过去

transform.rotation = Quaternion.Lerp(transform.rotation, targetQua, Time.deltaTime * turnSpeed);

}

else

{

//停下来

ani.SetFloat("Speed", 0f);

}

//判断当前是否是Locomotion状态

bool isLocomotion = ani.GetCurrentAnimatorStateInfo(0).IsName("Locomotion");

if (isLocomotion)

{

//判断脚步声音是不是已经开始播放了

if (!aud.isPlaying)

{

//播放声音

aud.Play();

}

}

else

{

//停止声音

aud.Stop();

}

}

/// <summary>

/// 播放喊叫声音

/// </summary>

public void PlayShoutAudio(float a) {

Debug.Log(a);

//播放喊叫声音

AudioSource.PlayClipAtPoint(shoutClip, transform.position);

}

}

找到关节

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class EthanIKController : MonoBehaviour

{

private Animator ani;

[Header("IK动画的开关")]

public bool ikActive = false;

[Header("射击敌人的最大角度")]

public float fireMaxAngle = 100;

[Header("IK指向的目标")]

public Transform target;

[Header("IK指向的目标身高")]

public float targetHeight = 1.8f;

private void Awake()

{

ani = GetComponent<Animator>();

}

private void OnAnimatorIK(int layerIndex)

{

//获取玩家指向敌人的方向向量

Vector3 dir=target.position - transform.position;

//计算夹角

float angle=Vector3.Angle(dir, transform.forward);

if (angle < fireMaxAngle / 2)

{

ikActive = true;

}

else {

ikActive = false;

}

if (ikActive)

{

//设置IK权重

ani.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);

//设置IK位置

ani.SetIKPosition(AvatarIKGoal.RightHand, target.position+Vector3.up*targetHeight);

//设置眼睛的IK权重

ani.SetLookAtWeight(1);

//设置眼睛的IK位置

ani.SetLookAtPosition(target.position+Vector3.up * targetHeight);

}

else {

//设置IK权重为0

ani.SetIKPositionWeight(AvatarIKGoal.RightHand, 0);

//设置眼睛权重为0

ani.SetLookAtWeight(0);

}

}

}

Curve

p341

绑定到一起只需要名称一致

p342

开始慢后期快

相关推荐
程序员正茂3 小时前
PICO+Unity MR视频透视
unity·ar·mr·pico
小白要加油哈7 小时前
游戏开发--C#面试题
开发语言·笔记·学习·microsoft·unity·c#·游戏引擎
zaizai10079 小时前
Unity性能优化 -- 性能分析工具
unity
辜月廿七1 天前
C#中日期和时间的处理
开发语言·游戏·unity·c#
zaizai10071 天前
Unity性能优化-具体操作
unity
MissMySwallow1 天前
开源项目工具:LeanTween - 为Unity 3D打造的高效缓动引擎详解(比较麻烦的API版)之二———补间动画控制API系列
3d·unity·游戏引擎
辜月廿七1 天前
Unity网络开发基础(part5.网络协议)
网络·网络协议·unity
Axis tech1 天前
Unity引擎智能座舱解决方案
unity
AD_喵了个咪1 天前
unity显示获取 年月日周几【日期】
unity
yi碗汤园2 天前
【一文了解】C#基础-集合
开发语言·前端·unity·c#