Unity (动画效果 和操控人物移动)

前沿

可以在store上选中自己的模型喜欢然后倒入到你的库中

 

然后场景中需要设置路线什么的 要用到导航

 因为天花板是头顶,不是静态的,所以把statc 给取消勾选

然后windows->>>Ai ------> Navigation  点击 level 模型

 

然后

 点击Bake 然后就是烘培了导航

 

导入资源包

 

 

人物移动跟随摄像机

新建PlayerContronller 控制器脚本

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 玩家控制的脚本
/// </summary>
public class PlayMovement : MonoBehaviour
{
    //世界坐标下的目标方向向量
    private Vector3 m_Movement;
    
    //旋转的四元数
    private Quaternion m_Rotation=Quaternion.identity;

    //游戏的对象的动画组件、刚体组件
    private Animator anim;
    private Rigidbody rd;

    //游戏对象的每一秒的旋转速度
    private float m_Speed = 20f;

    //音频组件--控制脚步声的音频
    AudioSource audioSource;
    // Start is called before the first frame update
    void Start()
    {
        rd=GetComponent<Rigidbody>();   
        anim=GetComponent<Animator>();
        audioSource=rd.GetComponent<AudioSource>();
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        //辅助记录目标坐标的水平分量与垂直分量。
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        //根据键盘的键值输入决定是否进行行走动画的播放
        bool IsHori = !Mathf.Approximately(horizontal, 0f);
        bool IsVori = !Mathf.Approximately(vertical, 0f);
        bool iswalking = IsHori || IsVori;
        anim.SetBool("IsWalking", iswalking);

        //控制脚步声声音的变化
        if (iswalking)
        {
            //人物正在移动,播放脚步声音
            if (!audioSource.isPlaying)
            {
                audioSource.Play();
            }
        }
        else 
        {
            //没有移动,关闭脚步声的播放
            audioSource.Stop();
        }

        //将键盘获取到的键值输入赋值给目标坐标
        m_Movement.Set(horizontal,0f,vertical);
        //归一(单位)化,得到世界坐标下的目标方向向量
        m_Movement.Normalize();

        //获取每帧应到达的世界坐标下的前向方向向量
        //用于计算旋转后角度的四元数
        Vector3 desiredForward = Vector3.RotateTowards(transform.forward,m_Movement,m_Speed*Time.deltaTime,0f);
        
        //每帧旋转后的四元数(Transform组件视角下的角度)
        m_Rotation=Quaternion.LookRotation(desiredForward);

        
    }

    //该方法在计算机、动画计算求值后,每一帧都会调用。  
    //解决根动画移动的问题,进行物理适时调用。
    private void OnAnimatorMove()
    {
        //运用刚体组件控制物体的移动与旋转,下列两个方法传入的参数均为目标值
        rd.MovePosition(transform.position + m_Movement * anim.deltaPosition.magnitude);
        rd.MoveRotation(m_Rotation);
    }

}

 

这段代码就是控制人物移动的数据,然后控制人物移动的动画

  //辅助记录目标坐标的水平分量与垂直分量。
  float horizontal = Input.GetAxis("Horizontal");
  float vertical = Input.GetAxis("Vertical");

  //根据键盘的键值输入决定是否进行行走动画的播放
  bool IsHori = !Mathf.Approximately(horizontal, 0f);
  bool IsVori = !Mathf.Approximately(vertical, 0f);
  bool iswalking = IsHori || IsVori;
  play_animator.SetBool("IsWalking", iswalking);

介绍在密室里面

   // Y轴失踪是不会动的 所以 为0F
   //将键盘获取到的键值输入赋值给目标坐标
   m_Movement.Set(horizontal, 0f, vertical);

//归一(单位)化,得到世界坐标下的目标方向向量
m_Movement.Normalize();

 

        //获取每帧应到达的世界坐标下的前向方向向量
        //用于计算旋转后角度的四元数
        Vector3 desiredForward = Vector3.RotateTowards(transform.forward, m_Movement, m_Speed * Time.deltaTime, 0f);

        //每帧旋转后的四元数(Transform组件视角下的角度)
        m_Rotation = Quaternion.LookRotation(desiredForward);

上面的代码就是世界坐标轴的方向

 

    /// <summary>
    ///该方法在计算机、动画计算求值后,每一帧都会调用。  
    ///解决根动画移动的问题,进行物理适时调用。
    /// </summary>
    private void OnAnimatorMove()
    {
        //运用刚体组件控制物体的移动与旋转,下列两个方法传入的参数均为目标值
        play_rigidbody.MovePosition(transform.position + m_Movement * anim.deltaPosition.magnitude);
        play_rigidbody.MoveRotation(m_Rotation);
    }

 

设置动画

 

操作步骤

 

动画化人物角色:

1.Models->Characters->JohnLemon拖入

2.GameObject->Align with view(调整视角)

3.创建预制体->open预制体->auto save取消勾选

4.给JohnLemon添加动画,创建文件夹MyAnimators->Animator Controller->双击进入

5.拖动John_Idle和John_Walk进入,左侧加入bool值isWalking,设置idle和walk的双向箭头

6.选中从idle到walk的箭头(双向都要操作),Has Exit Time取消勾选,然后设置Conditions,walk->idle选false,反向选true

7.动画状态给到游戏角色,John_Anim直接拖到人物的Controller上

 

新建Animaltor 如图

设置新的bool

 

 设置 他的走和战力的情况

 

 

然后在再运行游戏就可以看到了

 ok  完美

 

posted @ 2024-05-25 14:25  -鹿-  阅读(91)  评论(0编辑  收藏  举报