利用Animator实现骨骼动画:
1> 确保人物能够正常移动、Camera能够正常跟随
2> 使用WSAD对人物不同运动状态进行切换与连接
3> LeftShift:加速、Space:跳跃
4> 对于移动所产生的场景旋转以及视野跟随问题解决,可以参考我的另一篇文章:
https://blog.csdn.net/qq_42292831/article/details/84400575
<https://blog.csdn.net/qq_42292831/article/details/84400575>
5> 模型资源下载请访问游戏蛮牛官网 ( http://www.manew.com <http://www.manew.com> )
****************************************************************************************************************************************
一:运行效果
二:操作以及注意事项
0> 首先需要在Anumator中选择自己新建的Animator Controller文件:
1> 在Project中的动画文件夹中创建Animator Controller (状态控制机),双击打开
2> 设置左侧这些Float变量的目的:
拿W_Code举例:
当W键按下时,W_Code的键值就会变为1,松开按键,键值为0,这样人物的状态会切换为Walk状态;而且因为W还在Input.GetAxis("Vertical")的影响下沿着世界坐标的Z轴移动,Idle->Walk之间的切换完全依靠W键来确定。
3> 右侧箭头表示各个动作之间可以转换的方向与条件
这里就拿Run->Jump这个箭头举例,在Run的状态下当出现Jump_Code>0(1)时,就会触发跳跃动画
4> 注意事项:
在本Demo中出现了这样的情况:给人物与其他物体均添加的刚体属性,而且Camera属于人物的子物体,当两个刚体碰撞,Camera视角会莫名出现旋转。
取消被碰撞物体的刚体属性即可解决这种问题;
三:Scripts
1> 视角跟随:直接将Camera作为人物的子物体即可实现Camera的视角跟随
2> 视角移动:右键实现Camera视野左右移动(上下可将代码中的欧拉角指向y,但是范围过大而且无法更改,这里使用了x)
因为Camera是作为人物的子物体,所以将该脚本直接拖动到人物上将会直接是人物转向与Camera转向同步;
Camera_Follow.cs
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class Camera_Follow : MonoBehaviour { public Transform Camera; bool
Model_IsRotate = false; // Use this for initialization void Start () { } //
Update is called once per frame void Update () { if
(Input.GetMouseButtonDown(1)) { Model_IsRotate = true; } if
(Input.GetMouseButtonUp(1)) { Model_IsRotate = false; } if (Model_IsRotate) {
transform.RotateAround(transform.position, Vector3.up, 10 *
Input.GetAxis("Mouse X")); Vector3 originPosition = Camera.position; Quaternion
originRotation = Camera.rotation; Camera.RotateAround(transform.position,
transform.right, -10 * Input.GetAxis("Mouse Y")); if (Camera.eulerAngles.x < 0
|| Camera.eulerAngles.x > 50) //不明觉厉的欧拉角,但是能够设置x/y值来达到仰视和俯视的效果 {
Camera.position = originPosition; Camera.rotation = originRotation; } } } }
3> 人物移动 (控制Animator键值进行状态转换)
Roko_Movement.cs
using System.Collections; using System.Collections.Generic; using UnityEngine;
using UnityEngine.AI; public class Roko_Movement : MonoBehaviour { //public
NavMeshAgent agent; public Animator anim; public float wsad_MoveSpeed = 10;
bool Space_Key_Down = false; bool Left_Shift_Key_Down = false; bool W_Key_Down
= false; bool S_Key_Down = false; bool A_Key_Down = false; bool D_Key_Down =
false; // Use this for initialization void Start () { } // Update is called
once per frame void Update () { //if(Input.GetMouseButtonDown(0)) // { // Ray
ray = Camera.main.ScreenPointToRay(Input.mousePosition); // RaycastHit hit; //
if(Physics.Raycast(ray,out hit)) // { // agent.SetDestination(hit.point); // }
// } float h = Input.GetAxis("Horizontal"); float v =
Input.GetAxis("Vertical"); this.transform.Translate(new Vector3(h, 0, v) *
Time.deltaTime * wsad_MoveSpeed); //W键控制行走 if (Input.GetKeyDown(KeyCode.W)) {
W_Key_Down = true; } if (Input.GetKeyUp(KeyCode.W)) { W_Key_Down = false; } if
(W_Key_Down) { anim.SetFloat("W_Code", 1f); } if (!W_Key_Down) {
anim.SetFloat("W_Code", 0f); } //S键控制后退 if (Input.GetKeyDown(KeyCode.S)) {
S_Key_Down = true; } if (Input.GetKeyUp(KeyCode.S)) { S_Key_Down = false; } if
(S_Key_Down) { anim.SetFloat("S_Code", 1f); } if (!S_Key_Down) {
anim.SetFloat("S_Code", 0f); } //A键控制左转 if (Input.GetKeyDown(KeyCode.A)) {
A_Key_Down = true; } if (Input.GetKeyUp(KeyCode.A)) { A_Key_Down = false; } if
(A_Key_Down) { anim.SetFloat("A_Code", 1f); } if (!A_Key_Down) {
anim.SetFloat("A_Code", 0f); } //D键控制左转 if (Input.GetKeyDown(KeyCode.D)) {
D_Key_Down = true; } if (Input.GetKeyUp(KeyCode.D)) { D_Key_Down = false; } if
(D_Key_Down) { anim.SetFloat("D_Code", 1f); } if (!D_Key_Down) {
anim.SetFloat("D_Code", 0f); } //Left_Shift键加速 if
(Input.GetKeyDown(KeyCode.LeftShift)) { Left_Shift_Key_Down = true; } if
(Input.GetKeyUp(KeyCode.LeftShift)) { Left_Shift_Key_Down = false; } if
(Left_Shift_Key_Down) { anim.SetFloat("Speed_up_Code", 1f); } if
(!Left_Shift_Key_Down) { anim.SetFloat("Speed_up_Code", 0f); } //Space键控制Jump
if (Input.GetKeyDown(KeyCode.Space)) { Space_Key_Down = true; } if
(Input.GetKeyUp(KeyCode.Space)) { Space_Key_Down = false; } if (Space_Key_Down)
{ anim.SetFloat("Jump_Code", 1f); } if (!Space_Key_Down) {
anim.SetFloat("Jump_Code", 0f); } //anim.SetFloat("Speed",
agent.velocity.magnitude); } }
【2019.01.20】更新
关于跳跃部分:
改进效果:按一下Space键,跳跃执行一次(不会在跳跃中途终止),并实现跳跃结束动作与其他动作的完美衔接。
首先设置终止时间,然后拖动时间进度条,使得在跳跃动画未结束的时候执行向Idle动画的返回,以实现动画的过渡。
----------------------人物模型下载:游戏蛮牛官网 ( http://www.manew.com
<http://www.manew.com> )----------------------
热门工具 换一换