接下来我们来整理一下脚本,在原先的PlayerTestView脚本中充斥着很多杂七杂八的东西,现在我们将属于Animator的东西从这个脚本中分离出来,我们新建一个脚本PlayerTestVie_Anim用于存放动画类相关,两者的类名是相同的,只是因为臃肿所以用partial关键字区分为两个脚本。
除此之外,还添加了一个新功能,在RPG中,一段时间不去操作,角色的站立姿势就会发现改变,用于挑逗玩家,我们这里进行了时装,为了实装每隔一段时间的操作,我们就需要引入一个新的东西,计时器的功能是必不可少的,大家可以去看一看一位大佬的简书,这里附上地址。
计时器简介
在通读了计时器的脚本之后,我们发现他的一部分内容还是和我们预先设定的有些违背(关于update的管理),所以在这里我进行更改,如果大家也一起做,你们不做更改也是行的。
下面是动画控制器的修改


下面附上新脚本PlayerTestVie_Anim的内容:
/*
* PlayerTestView
* 将来这个脚本里的功能坑定会制作一个接口类,用存放其中其动画功能,毕竟能走能跑能站的不只是player,还有很多NPC以及怪物
*/
using strange.extensions.mediation.impl;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Animator))]
public partial class PlayerTestView:View {
[Header("===== 组件 =====")]
Animator animator;
[Header("===== 数据 =====")]
PlayerAnimaId pad;
Timer idleTypeTimer;
[Tooltip("idle 动画切换的间隔时间")]
float idleChangeTime = 5;
[Tooltip("idle 动画开始转变信号")]
bool idleChangeing = false;
[Tooltip("idle 动画开始转变的渐变数值")]
float idleRange = 0;
enum Idle_Type {//idle的形态变换,与动画数据的相关,idle的数值切换相同。0,1,2,3
idle_A = 0,
idle_B,
idle_C,
idle_D,
}
Idle_Type newIdle_Type = Idle_Type.idle_A;
struct PlayerAnimaId {
public int Idle;//禁止状态行为切换控制。
public int baseAniam;
};
private void playerAnimatorInit() {
pad = new PlayerAnimaId();
animator = GetComponent<Animator>();
pad.baseAniam = Animator.StringToHash("walk");
pad.Idle = Animator.StringToHash("Idle");
}
/// <summary>
/// 播放 三个基础动画
/// </summary>
private void animator_PlayBaseAniam() {
animator.SetFloat(pad.baseAniam, lerpSpeed);
}
/// <summary>
/// 如果站立的时间太久,那么就切换一种idle形态。这里我们默认为5秒
/// </summary>
private void animator_ChangeIdle() {
if (controlDistance == 0) {//代表此时已经完全停下
if (idleTypeTimer == null || idleTypeTimer.isDone) {//如果没有计时器或者计时器处于空闲状态
idleTypeTimer = Timer.Register(idleChangeTime, () => {
idleChangeing = true;
newIdle_Type = (Idle_Type)Random.Range((int)Idle_Type.idle_A + 1, (int)Idle_Type.idle_D + 1);//获取一个最新的Idle来替换。在BCD中挑选
});
}
if (idleChangeing) {//可以发生改变
idleRange = Mathf.Lerp(idleRange, (float)newIdle_Type, 0.05f);
animator.SetFloat(pad.Idle, idleRange);
}
} else {
animator.SetFloat(pad.Idle, (float)Idle_Type.idle_A);//刚起步的的时候默认A动画。
idleChangeing = false;
idleRange = (float)Idle_Type.idle_A;//刚起步的的时候默认A状态
}
}
}
PlayerTestView的码子如下:
using strange.extensions.mediation.impl;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public partial class PlayerTestView:View {
/// <summary>
//public water plane;
/// </summary>
// Use this for initialization
[Header("===== 组件 ====")]
Rigidbody rig;
CapsuleCollider capsuleCollider;
[Header("===== 数据 ====")]
float lerpSpeed = 0;//控制衰减。
float controlDistance = 0;//控制距离
float addSpeed = 1;
float runSpeed = 3;
float walkSpend = 1;
private Vector3 moveDirection;
Transform player;
public void init() {
rig = GetComponent<Rigidbody>();
player = transform;
playerAnimatorInit();
capsuleCollider = GetComponent<CapsuleCollider>();
}
public void animaBlendAction(float right, float forward, bool run) {//设置转向以及速度
Vector3 vec = (right * Vector3.right + forward * Vector3.forward);//设置方向
controlDistance = vec.magnitude;
if (controlDistance < Vector3.kEpsilon) {//停下
controlDistance = 0;
lerpSpeed = Mathf.Lerp(lerpSpeed, 0, 0.2f);//速度逐渐归零。
} else {//开始行动
player.forward = Vector3.Slerp(player.forward, vec, 0.2f);//设置转向
float upperLimit = run ? runSpeed : walkSpend;
lerpSpeed = Mathf.Lerp(lerpSpeed, upperLimit, 0.1f);//速度逐步上升。
}
animator_ChangeIdle();//播放Idle
animator_PlayBaseAniam();//播放动画
moveDirection = Vector3.Project(moveDirection, Vector3.up);
moveDirection += player.forward * lerpSpeed * addSpeed;
}
public void playerMove() {
//**//
//player.position += moveDirection * Time.deltaTime;
//rig.velocity = Vector3.zero;
//**//
rig.velocity = moveDirection;
}
}

由于没有找到好一点的动作,比如无聊踢腿之类的那些,所有看着有些怪怪的~
网友评论