1.导入资源包
2.进入场景
双击导入的scenes资源包中的场景,让场景出现到3D窗口中去
3.配置物体player
添加刚体、胶囊碰撞器、以及动画器
- 设置刚体属性,冻结旋转的xyz位置 --防止人物走的时候颠倒问题
- 设置中心y轴为0.75,半径为0.3,高度设置为1.5,--保证任务胶囊体是刚好站在地面上的,如果不能计算好高度的话,会出现运行的时候人物掉下去的问题。
- 设置动画控制器,控制器源选择你自己创建的动画控制器,avatar选择untiychanAvatar
4.设置动画域(移动、跳跃)
双击创建好的动画控制器,设置动画域
1.将sword-idle拖拽到动画窗格中
2.新建float类型的变量,变量名为speed
注意点:并双击之后在右侧面板的parameter变量中选择speed
3.新建混合树
目的:实现慢走和快跑功能
混合树命名为changetojump,添加运动域,将两个慢走和跑步的动作加进来,并设置前进慢走的值为0.2,跑步值为2;取消勾选automate thresholds 否则设置不了值
4.创建前进的过渡
初始化站立到混合树的过渡,勾选speed,模式选择大于0.2进入慢走状态 当值超过2的时候进入慢走状态(取消退出时间)
初始化站立到混合树的过渡,勾选speed,模式选择小于0.1, 当值小于0.1的时候保持初始状态(取消退出时间)
5.拖拽后退动作到窗格中
6.创建后退操作的过渡
初始化站立到后退动作的过渡,将值选择为speed,模式选择小于-0.2
当值小于-0.2的时候开始后退操作(取消退出时间)
后退动作到初始化站立的过渡,将值选择为speed,模式选择大于-0.1
当值大于-0.1的时候保持原有的站立状态(取消退出时间)
7.拖拽左前进和右前进动作到窗格中
8.创建左前进和右前进的过渡
思路:一开始我们是打算将左前动作和右前动作通过混合树来控制的,但是在实际开发中发现现阶段很难实现多种状态的监听,所以在这里我们分开进行动作的实现
创建了一个int类型的xSpeed,用来监听左右前进的值
设置左前进的过渡,初始化站立到左前进的过渡将值选择为xSpeed,模式选择为小于0的时候进行左前进的操作,当等于0的时候结束左前进(取消退出时间)
设置右前进的过渡,初始化站立到右前进的过渡将值选择为xSpeed,模式选择为大于0的时候进行右前进的操作,当等于0的时候结束右前进(取消退出时间)
9.拖拽跳跃动作到动画窗格中
10.创建跳跃的过渡
创建一个trigger类型的变量jump,用来控制人物的跳跃
初始化站立到跳跃动作选择jump变量,(取消退出时间)
跳跃动作到中间枢纽不需要选择变量jump,(保留退出时间)--目的是我们可以保留退出跳跃的动画,只有跳跃动画结束后我们才可以继续跳跃,这一点是要符合游戏设计的
行走混合树到跳跃动作的过渡,设置值选择为jump即可(取消退出时间)
完整的动画路径如下:
11.人物的慢走、快跑、跳跃效果如下:
5.添加混合动画(实现攻击)
1.混合动画的概念:
混合动画:同时播放两个动画 比如边走边攻击
人物遮罩作用:可以屏蔽当前动画里面某一个骨骼的动作,我们知道人物骨骼动画是由每一个肢体的动画组成的
2.新建新图层
在动画器窗格中的图层窗格-点击+号进行新建
3.设置动画域
设置动画域的前提先创建一个avatar遮罩
avatar遮罩现阶段可以理解为就是一个遮罩,它可以把你的动作也藏起来,类似于把你骨骼中的某多个关节进行隐藏遮罩,可以让这些关节不执行不运动
设置IK不运动
添加完成后将新遮罩,将权重设置为1,这个权重你可以理解为前端的样式选择器的权重问题,在所有的动画中,当前这个动画的权重是最高的,其他的不能覆盖他的作用;将新建好遮罩拖入图层遮罩源中,并将正在混合模式改为additive,改为追加的模式
创建一个空状态,一开始我们人物是不进行攻击的,所以什么动作都不用进行导入
创建一个trigger类型变量的attack,用来监听是否可以执行攻击的操作
设置空状态到攻击,选择值为attack,(取消退出时间)
设置攻击到空状态,不用选择(保留退出时间)--更要重视攻击完结束的动画
双击攻击的面板,将循环时间和循环动作勾选上,可以更好的观察攻击的变化
添加攻击事件(可以实现攻击的时候发出远程发出火光子弹的效果--远程攻击) 函数名称是你在脚本文件里面定义的函数方法名,fire是你创建的粒子系统设置的攻击效果-火光子弹
注意:我们在导入动画动作的时候,要查看源动作是否已经具有了事件,如果具有我们现阶段先将他们带有的事件删除,否则会出现运行不了的问题
6.编写player脚本文件
并将player脚本文件挂载到player人物身上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class player : MonoBehaviour
{
//鼠标的水平偏移量
float mouseX = 0;
//需要有一个速度 speed;
private float speed = 0f;
//有一个最大值
public float maxZ = 6;
//垂直虚拟轴;
float z = 0;
//水平虚拟轴
float x = 0;
//加速度
public float a = 0.03f;
//加速度次数
int i = 0;
//刚体
Rigidbody rig;
//动画控制器
Animator ani;
//记录左右动作状态
int xSpeed = 0;
void Start()
{
//获取刚体
rig = GetComponent<Rigidbody>();
//获取动画控制器
ani = GetComponent<Animator>();
//鼠标隐藏
Cursor.lockState = CursorLockMode.Locked;
}
// Update is called once per frame
void Update()
{
//获取垂直虚拟轴和水平虚拟轴
z = Input.GetAxis("Vertical");
x = Input.GetAxis("Horizontal");
if (x != 0 || z != 0) //说明按下了按键
{
//往前走,正常是慢走,按住shift的时候会变为快跑,最大速度是8,过程是逐渐加速至最大值
//普通速度
//奔跑速度 按下shift加速 加速的时候从2开始加速,然后到8的时候停止
if (Input.GetKey(KeyCode.LeftShift) && z > 0)
{
i++;
speed = speed >= maxZ ? maxZ : 2 + i * a;
}
else
{
i = 0;
speed = z;
}
//因为x是浮点类型,我们程序需要的是int类型,所以我们需要临时变量转化一下
xSpeed = x > 0f ? 1 : -1;//切换xSpeed的值
//让人物移动
transform.position += transform.forward * speed * Time.deltaTime;
//在跑的时候不能直接切换成左右走,要先回到初始状态,再左右移动
transform.position += transform.right * x * Time.deltaTime;
//也通过x速度去切换呢?
//按下的是A键 为true,按下D键为false 松开手的时候回到初始的状态
}
//判断是否按下空格键 按下时播放跳跃动作
//ani.GetCurrentAnimatorStateInfo(0).IsTag("changetojump") --可以防止后退的时候不能跳跃的功能
if (Input.GetKeyDown(KeyCode.Space) && ani.GetCurrentAnimatorStateInfo(0).IsTag("changetojump")) //还要判断当时没有在播放跳跃动画
{
ani.SetTrigger("jump");
//给胶囊碰撞体一个向上的力
rig.AddForce(Vector3.up * 180);
}
//在外面更改值,按下设置xSpeed值,松开也要设置值为0
ani.SetFloat("speed", speed);
if (x == 0f) xSpeed = 0;
ani.SetInteger("xSpeed", xSpeed);
//镜头左右移动其实就是改变任务y轴旋转的值
//transform.Translate
//获取鼠标水平偏移量
mouseX = Input.GetAxis("Mouse X");
//改变旋转
transform.Rotate(Vector3.up * mouseX*10);//相对于原来的位置进行旋转
//混合动画:同时播放两个动画 比如边走边攻击
//人物遮罩作用:可以屏蔽当前动画里面某一个骨骼的动作,我们知道人物骨骼动画是由每一个肢体的动画组成的
if (Input.GetMouseButtonDown(0)) //鼠标左键按下的时候
{
Debug.Log("鼠标左键点击");
//切换attack的值
ani.SetTrigger("attack");
}
}
//编写事件的方法
public void attack(GameObject fireAttack)
{
Debug.Log("发射光");
}
}