Unity3D学习 ④ Unity导入商店资源,实现基本的奔跑、攻击动作切换与交互

article/2025/9/29 15:51:16

1.导入unity3D商店资源

① 直接进入unity商店下载

Unity Asset Store - The Best Assets for Game Makinghttps://assetstore.unity.com/② 在3D下面的动画栏,点进去然后找些自己喜欢的模型就好了,可以通过排序“价格由低到高”筛选些免费的模型。

下面这个是我用到的模型:

Melee Warrior Animations FREE | 3D Animations | Unity Asset Store

③ 点击右边添加到我的资源,再点击在unity打开后,就能在unity的PackageManager里面看见导入的资源。需要注意的是网页端登陆的账号和你unity登陆的账号要一样。

 ④ 点击Download下载好之后,再点击Import加载即可。如果这个窗口没自动跳出来,可以通过unity上方的windows下的PackageManager打开。

 

2.导入模型之后的使用

① 引入后在project栏下的Assets文件夹下可以看到我们导入的模型。需要注意的是有的模型导入之后没有动画,是需要自己创建动画才能实现人物动作的。

 ② 我们现在在SampleScene里面创建一个plane地面(要不要无所谓),将导入在Assets/Kevin Iglesias/prefabs/Characters位置下面的模型swordwarrior放在SampleScene里面。

④ 点击SwordWarrior,在其Inspector下面的Add Compent给他添加一个Rigidbody(刚体)属性。记得use Gravity别点,不然会掉下去(如果没地面的话)。

 3.设置奔跑动画

① 在SwordWarrior上面我们可以看到Animator这一栏,这一栏就是控制他动画的地方。轻点Controller后的,可以跳到相应的位置,查看动画的状态图。这个东西存放在Assets/Kevin Iglesias/AnimatorController/1H下面。

② 点击之后可以看到一个状态图,可以简单的理解成,你可以设置一些条件,如果满足这些条件模型将不断切换各种状态。这里的状态就是对应游戏中的各种动作。 

 ③ 我们在这个位置新建一个AnimatorController,用来存放我们自己定义的跑步和攻击动作的切换。

④ 注意打开我们新建的AnimatorController,在我们导入的资源的Assets/Kevin Iglesias/Animations/OneHanded下将模型的平常待机动画拖入其中

【这个页面也有点反人类,滚轮滑动控制界面大小,通过按住鼠标滚轮中键实现界面的拖动】

 

 ⑤ 在Movement下找到奔跑的动画,同样拖拽进去,这里会有很多的状态,我们仅需要forward即可。

 ⑥ 右键状态图,再点击MakeTransition生成连线。

 

 ⑦ 设置状态切换参数,点击Animator下面的加号生成一个bool参数,我们通过这个参数实现不同状态(动作)切换的控制。

 ⑧ 取名为Run,点击状态图idle状态到forward状态的连线,在右边出现的窗口的Conditions【通过这里面的条件控制状态切换】下面点击加号将之前设置的Run放上去,值取true。另一根连线取值同样为Run,值取为false。

翻译一下就是:当Run值为true时,状态从idle切换到forward,当Run值为false时,状态从forward切换到idle。实现跑步和正常待机状态的切换。

 

  4.设置奔跑代码

① 在设置好奔跑的状态切换之后,我们将创建的这个AnimatorController放到我们模型中Animator栏目下的Controller上。 

② 在Assets中新建一个Scripts文件夹,在文件夹中新增一个名叫Move的C#脚本文件 ,并将这个脚本文件挂载载我们的模型上。【直接拖进去即可】

③ 给出实现奔跑的代码:

public class Move : MonoBehaviour
{// 控制物体的移动速度public float moveSpeed = 5f;// 刚体属性private Rigidbody rb;// 动画属性private Animator animator;// 位置移动private Vector3 targetPos;// 控制是否移动的bool变量private bool isMove;// 在开始的一帧执行的函数void Start(){// 获取当前物体的刚体属性rb = GetComponent<Rigidbody>();// 获取当前物体的动画属性animator = GetComponent<Animator>();}// 刷新的每一帧执行的函数void Update(){// 接收键盘操作函数Run();// 移动状态if (isMove){// 这里的Run是之前我们创建的状态转换的那个参数的名字,根据自己的设置修改animator.SetBool("Run", isMove);// 实现人物的移动rb.velocity = transform.forward * moveSpeed * 1.1f;// 在距离目标的地点很近的时候(0.1f),停止移动if (Vector3.Distance(transform.position, targetPos) < 0.1f){rb.velocity = Vector3.zero;isMove = false;animator.SetBool("Run", isMove);}}}void Run(){// 处理点击w前移逻辑if (Input.GetKey(KeyCode.W)){//记录下目标点targetPos = new Vector3(transform.localPosition.x, transform.localPosition.y, transform.localPosition.z + 1);// 转向transform.LookAt(targetPos);//改变移动StateisMove = true;}// 处理点击a左移逻辑if (Input.GetKey(KeyCode.A)){//记录下目标点targetPos = new Vector3(transform.localPosition.x - 1, transform.localPosition.y, transform.localPosition.z);// 转向transform.LookAt(targetPos);//改变移动StateisMove = true;}// 处理点击s后移逻辑if (Input.GetKey(KeyCode.S)){//记录下目标点targetPos = new Vector3(transform.localPosition.x, transform.localPosition.y, transform.localPosition.z - 1);// 转向transform.LookAt(targetPos);//改变移动StateisMove = true;}// 处理点击D右移逻辑if (Input.GetKey(KeyCode.D)){// 记录下目标点targetPos = new Vector3(transform.localPosition.x + 1, transform.localPosition.y, transform.localPosition.z);// 转向transform.LookAt(targetPos);// 改变移动状态isMove = true;}}
}

 ④ 到这里能实现模型的奔跑和平常动作的切换了,但还有个小问题,就是按键运动的时候,模型有时候会很诡异的停止,这是因为有一个动画持续时间的设置,将动画中的HasExitTime的✔取消掉即可。 

 

 5.设置攻击动画

① 攻击动画和奔跑动画不同,这里我们设置能从任何状态切换到攻击状态。

② 新建一个trigger来监听这个状态切换。

③ 取出位于Assets/Kevin Iglesias/Animations/OneHanded/RightHand下面的攻击动画。

④ 将其切换状态条件设置为我们新建的Trigger,“Attack”。

 ④ 将attack状态与idle状态和forward状态状态相连,从attack状态转化到forward状态转换条件设为Run为true,从attack状态转化到idle状态转换条件设为Idle为true。这里idle要再自己新建一个bool参数的,并打上✔。【这里不点击✔就需要自己去代码里初始化设置】

  5.设置攻击代码

① 修改之前创建的脚本文件代码即可:

这里设置的是点击J即进行攻击操作。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Move : MonoBehaviour
{// 控制物体的移动速度public float moveSpeed = 5f;// 刚体属性private Rigidbody rb;// 动画属性private Animator animator;// 位置移动private Vector3 targetPos;// 控制是否移动的bool变量private bool isMove;// 控制是否攻击的bool变量private bool isAttack;// 在开始的一帧执行的函数void Start(){// 获取当前物体的刚体属性rb = GetComponent<Rigidbody>();// 获取当前物体的动画属性animator = GetComponent<Animator>();}// 刷新的每一帧执行的函数void Update(){// 接收键盘操作函数Run();// 移动状态if (isMove){// 这里的Run是之前我们创建的状态转换的那个参数的名字,根据自己的设置修改animator.SetBool("Run", isMove);// 实现人物的移动rb.velocity = transform.forward * moveSpeed * 1.1f;// 在距离目标的地点很近的时候(0.1f),停止移动if (Vector3.Distance(transform.position, targetPos) < 0.1f){rb.velocity = Vector3.zero;isMove = false;animator.SetBool("Run", isMove);}}// 攻击状态if (isAttack){animator.SetBool("Attack", isAttack);isAttack = false;}}void Run(){// 处理点击w前移逻辑if (Input.GetKey(KeyCode.W)){//记录下目标点targetPos = new Vector3(transform.localPosition.x, transform.localPosition.y, transform.localPosition.z + 1);// 转向transform.LookAt(targetPos);//改变移动StateisMove = true;}// 处理点击a左移逻辑if (Input.GetKey(KeyCode.A)){//记录下目标点targetPos = new Vector3(transform.localPosition.x - 1, transform.localPosition.y, transform.localPosition.z);// 转向transform.LookAt(targetPos);//改变移动StateisMove = true;}// 处理点击s后移逻辑if (Input.GetKey(KeyCode.S)){//记录下目标点targetPos = new Vector3(transform.localPosition.x, transform.localPosition.y, transform.localPosition.z - 1);// 转向transform.LookAt(targetPos);//改变移动StateisMove = true;}// 处理点击D右移逻辑if (Input.GetKey(KeyCode.D)){// 记录下目标点targetPos = new Vector3(transform.localPosition.x + 1, transform.localPosition.y, transform.localPosition.z);// 转向transform.LookAt(targetPos);// 改变移动状态isMove = true;}// 处理攻击事件if (Input.GetKey(KeyCode.J)){//设置triggeranimator.SetTrigger("Attack");}}
}

总结

unity的一些操作真的太容易忘了,而且我采用的这种写法和动画的设置肯定不是最有效率最专业的,只能说慢慢在实践中学习吧。说实话能看见自己找的模型动起来还是挺有成就感的。越接触这些东西,就越觉得真的现在的独立开发者真的太难太辛苦了。


http://chatgpt.dhexx.cn/article/bJ47HsiS.shtml

相关文章

Unity 3D 资源下载 || Unity 3D 综合案例

Unity 3D 资源下载 你也可以在 Unity 3D 中执行 Window → Asset Store 菜单命令直接访问 Unity 资源商店&#xff08;Asset Store&#xff09;。 Unity 资源商店简介 Unity 资源商店https://www.assetstore.unity3d.com/ 中提供了多种类的游戏媒体资源&#xff08;人物模型…

Unity 3D 导入资源包 || Unity 3D 导出资源包

项目中的一些资源具有复用性&#xff0c;只需要将资源导出&#xff0c;就能够重复使用。 导出资源包 执行 Assets → Select Dependencies 菜单命令&#xff0c;选中与导出资源相关的内容。接着执行 Assets→ Export Package 菜单命令。 弹出的 Exporting Package 导出资源对话…

干货整理 Unity3D资源汇总

Unity3D是目前最流行的游戏开发工具&#xff0c;是一个可以让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具&#xff0c;是一个全面整合的专业游戏引擎。 为了让开发者能够系统全面的学习Unity3D知识&#xff0c;CSDN特…

嵌入式编程之状态机

文章目录 1、什么是状态机&#xff1f;2、状态机编程的优点(1)提高CPU使用效率(2) 逻辑完备性(3)程序结构清晰 3、状态机的三种实现方法switch—case 法表格驱动法函数指针法小节 摘要&#xff1a;不知道大家有没有这样一种感觉&#xff0c;就是感觉自己玩单片机还可以&#xf…

FPGA学习之状态机

1. 理论学习 状态机简写为FSM&#xff0c;也称为同步有限状态机&#xff0c;我们简称为状态机。所以说同步时因为状态机中所有的状态跳转都是在时钟的作用下进行的&#xff0c;而有限则是说状态机的个数有限的。状态机分为两大类&#xff0c;即Moore状态机和Mealy状态机&#…

单片机的状态机介绍

当初是粘贴复制的&#xff0c;格式已经乱了&#xff0c; pdf文档自行下载: 单片机高级编程.pdf_51单片机编程pdf-单片机文档类资源-CSDN下载 第1章 单片机初试牛刀 1.1 一个LED闪烁的故事 用单片机实现1个LED闪烁功能&#xff0c;要求LED亮500ms, 灭300ms。这个问题对于学过单…

状态机的概念与设计

⭐本专栏针对FPGA进行入门学习&#xff0c;从数电中常见的逻辑代数讲起&#xff0c;结合Verilog HDL语言学习与仿真&#xff0c;主要对组合逻辑电路与时序逻辑电路进行分析与设计&#xff0c;对状态机FSM进行剖析与建模。 &#x1f525;文章和代码已归档至【Github仓库&#xf…

c++状态机的使用

什么是状态机 状态机是有限状态自动机的简称&#xff0c;是现实事物运行规则抽象而成的一个数学模型。英文名字叫State Machine &#xff0c;不是指一台实际机器&#xff0c;一般就是指一张状态转换图。全称是有限状态自动机&#xff0c;自动两个字包含重要含义。给定一个状态…

状态机设计举例

⭐本专栏针对FPGA进行入门学习&#xff0c;从数电中常见的逻辑代数讲起&#xff0c;结合Verilog HDL语言学习与仿真&#xff0c;主要对组合逻辑电路与时序逻辑电路进行分析与设计&#xff0c;对状态机FSM进行剖析与建模。 &#x1f525;文章和代码已归档至【Github仓库&#xf…

浅谈状态机

一、状态机原理 &#xff08;一&#xff09;有限状态机 状态机由状态寄存器和组合逻辑电路构成&#xff0c;能够根据控制信号按照预先设定的状态进行状态转移&#xff0c;是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为FSM&#xff08;Finite State Machine&…

状态机与序列机

状态机由状态寄存器和组合逻辑电路构成&#xff0c;能够根据控制信号按照预先设定的状态进行状态转移&#xff0c;是协调相关信号动作、完成特定操作的控制中心。 一、线性序列机 序列机是什么&#xff1a;用计数器对时钟个数计数&#xff0c;根据相应时钟周期下的单个周期时…

状态机总结(简洁)

一、概念 状态机简写为 FSM&#xff08;Finite State Machine&#xff09;&#xff0c;也称为同步有限状态机&#xff0c;我们一般简称为状态机&#xff0c;之所以说“同步”是因为状态机中所有的状态跳转都是在时钟的作用下进行的&#xff0c;而“有限”则是说状态的个数是有…

有限状态机详解(转载)

以前总觉得有限状态机和无限状态机非常的难理解&#xff0c;原来也就是自己一直没有一个直观的认识&#xff0c;今天看到一篇博客&#xff0c;总算对有限状态机入门了。一看就懂。 转载地址&#xff1a;http://blog.csdn.net/zqixiao_09/article/details/50239337 我们知道&a…

状态机

有限状态机&#xff08;Finite State Machine或者Finite State Automata)是软件领域中一种重要的工具&#xff0c;很多东西的模型实际上就是有限状态机。最近看了一些游戏编程AI的材料&#xff0c;感觉游戏中的AI&#xff0c;第一要说的就是有限状态机来实现精灵的AI&#xff0…

状态机的深入理解

目录 1.什么是状态机 2. 生活中的状态机 3. 工程中的应用 4. 发散思考 1.什么是状态机 ■1.1 有向图 有向图是指由定点和边构成的集合&#xff0c;我们常用G&#xff08;E, V&#xff09;来表示一个有向图&#xff0c;其中定点之间由有向边进行连接就构成了有向图。有向图…

有限状态机

文章目录 有限状态机状态机的表示状态转移图二维表 实现穷举法查表法状态模式 总结 有限状态机 有限状态机(Finite State Machine) 缩写为 FSM。以下简称为状态机。 状态机有 3 个组成部分&#xff1a;状态、事件、动作。 状态&#xff1a;所有可能存在的状态。包括当前状态和…

什么是状态机?

前言 状态机在实际工作开发中应用非常广泛&#xff0c;在刚进入公司的时候&#xff0c;根据公司产品做流程图的时候&#xff0c;发现自己经常会漏了这样或那样的状态&#xff0c;导致整体流程会有问题&#xff0c;后来知道了状态机这样的东西&#xff0c;发现用这幅图就可以很…

什么是状态机(Finite-state machine)?

有限状态机 有限状态机(FSM)1、 什么是“状态”2、什么是状态机&#xff1f;3、状态机图怎么画&#xff1f;参考 有限状态机(FSM) 1、 什么是“状态” 先来解释什么是“状态”&#xff08; State &#xff09;。现实事物是有不同状态的&#xff0c;例如一个自动门&#xff0c…

什么是状态机?用C语言实现进程5状态模型

前言 状态机在实际工作开发中应用非常广泛&#xff0c;在刚进入公司的时候&#xff0c;根据公司产品做流程图的时候&#xff0c;发现自己经常会漏了这样或那样的状态&#xff0c;导致整体流程会有问题&#xff0c;后来知道了状态机这样的东西&#xff0c;发现用这幅图就可以很…

状态机(state machine)

一、状态机分类 Mealy状态机:输出取决于输入和当前状态 状态寄存器:由一组触发器组成,用来记忆状态机当前所处的状态,状态的改变只发生在时钟的跳变沿。状态寄存器由一组触发器组成,用来记忆状态机当前所处的状态,状态的改变只发生在时钟的跳变沿。 状态是否改变、如何…