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

开始慢后期快

相关推荐
HH‘HH2 小时前
Unity 相机与光照调整:从基础到进阶的实战指南
unity
HH‘HH20 小时前
Unity引擎界面各个功能面板详细介绍
unity·游戏引擎
℡枫叶℡20 小时前
Unity 2D资产命名常用缩写
unity·资产命名缩写
丁小未1 天前
Unity AssetBundle商业化项目资源方案
unity·游戏引擎·assetbundle·unity框架
unityのkiven1 天前
通过 Unity 实现杀戮尖塔2式卡牌系统与机制
unity·游戏引擎
郝学胜-神的一滴1 天前
中级OpenGL教程 020:巧用数组与循环实现多点点光源渲染,告别冗余代码重构方案
c++·unity·游戏引擎·godot·图形渲染·unreal
qq_170264751 天前
unity的锁帧和垂直同步
unity·游戏引擎
承渊政道1 天前
飞算Java炫技赛:Java×Unity数字孪生园区平台的从零落地记录
java·开发语言·unity·技术分享·vibe coding·飞算javaai·飞算java ai炫技赛
unityのkiven2 天前
Unity 共享材质修改问题与 MaterialPropertyBlock 解决方案
unity·游戏引擎·材质
丁小未2 天前
Unity 极致高效的IM设计方案教程
unity·性能优化·游戏引擎·im