当前位置:   article > 正文

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

unity商店资源在unity中打开

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#脚本文件 ,并将这个脚本文件挂载载我们的模型上。【直接拖进去即可】

③ 给出实现奔跑的代码:

  1. public class Move : MonoBehaviour
  2. {
  3. // 控制物体的移动速度
  4. public float moveSpeed = 5f;
  5. // 刚体属性
  6. private Rigidbody rb;
  7. // 动画属性
  8. private Animator animator;
  9. // 位置移动
  10. private Vector3 targetPos;
  11. // 控制是否移动的bool变量
  12. private bool isMove;
  13. // 在开始的一帧执行的函数
  14. void Start()
  15. {
  16. // 获取当前物体的刚体属性
  17. rb = GetComponent<Rigidbody>();
  18. // 获取当前物体的动画属性
  19. animator = GetComponent<Animator>();
  20. }
  21. // 刷新的每一帧执行的函数
  22. void Update()
  23. {
  24. // 接收键盘操作函数
  25. Run();
  26. // 移动状态
  27. if (isMove)
  28. {
  29. // 这里的Run是之前我们创建的状态转换的那个参数的名字,根据自己的设置修改
  30. animator.SetBool("Run", isMove);
  31. // 实现人物的移动
  32. rb.velocity = transform.forward * moveSpeed * 1.1f;
  33. // 在距离目标的地点很近的时候(0.1f),停止移动
  34. if (Vector3.Distance(transform.position, targetPos) < 0.1f)
  35. {
  36. rb.velocity = Vector3.zero;
  37. isMove = false;
  38. animator.SetBool("Run", isMove);
  39. }
  40. }
  41. }
  42. void Run()
  43. {
  44. // 处理点击w前移逻辑
  45. if (Input.GetKey(KeyCode.W))
  46. {
  47. //记录下目标点
  48. targetPos = new Vector3(transform.localPosition.x, transform.localPosition.y, transform.localPosition.z + 1);
  49. // 转向
  50. transform.LookAt(targetPos);
  51. //改变移动State
  52. isMove = true;
  53. }
  54. // 处理点击a左移逻辑
  55. if (Input.GetKey(KeyCode.A))
  56. {
  57. //记录下目标点
  58. targetPos = new Vector3(transform.localPosition.x - 1, transform.localPosition.y, transform.localPosition.z);
  59. // 转向
  60. transform.LookAt(targetPos);
  61. //改变移动State
  62. isMove = true;
  63. }
  64. // 处理点击s后移逻辑
  65. if (Input.GetKey(KeyCode.S))
  66. {
  67. //记录下目标点
  68. targetPos = new Vector3(transform.localPosition.x, transform.localPosition.y, transform.localPosition.z - 1);
  69. // 转向
  70. transform.LookAt(targetPos);
  71. //改变移动State
  72. isMove = true;
  73. }
  74. // 处理点击D右移逻辑
  75. if (Input.GetKey(KeyCode.D))
  76. {
  77. // 记录下目标点
  78. targetPos = new Vector3(transform.localPosition.x + 1, transform.localPosition.y, transform.localPosition.z);
  79. // 转向
  80. transform.LookAt(targetPos);
  81. // 改变移动状态
  82. isMove = true;
  83. }
  84. }
  85. }

 ④ 到这里能实现模型的奔跑和平常动作的切换了,但还有个小问题,就是按键运动的时候,模型有时候会很诡异的停止,这是因为有一个动画持续时间的设置,将动画中的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即进行攻击操作。

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Move : MonoBehaviour
  5. {
  6. // 控制物体的移动速度
  7. public float moveSpeed = 5f;
  8. // 刚体属性
  9. private Rigidbody rb;
  10. // 动画属性
  11. private Animator animator;
  12. // 位置移动
  13. private Vector3 targetPos;
  14. // 控制是否移动的bool变量
  15. private bool isMove;
  16. // 控制是否攻击的bool变量
  17. private bool isAttack;
  18. // 在开始的一帧执行的函数
  19. void Start()
  20. {
  21. // 获取当前物体的刚体属性
  22. rb = GetComponent<Rigidbody>();
  23. // 获取当前物体的动画属性
  24. animator = GetComponent<Animator>();
  25. }
  26. // 刷新的每一帧执行的函数
  27. void Update()
  28. {
  29. // 接收键盘操作函数
  30. Run();
  31. // 移动状态
  32. if (isMove)
  33. {
  34. // 这里的Run是之前我们创建的状态转换的那个参数的名字,根据自己的设置修改
  35. animator.SetBool("Run", isMove);
  36. // 实现人物的移动
  37. rb.velocity = transform.forward * moveSpeed * 1.1f;
  38. // 在距离目标的地点很近的时候(0.1f),停止移动
  39. if (Vector3.Distance(transform.position, targetPos) < 0.1f)
  40. {
  41. rb.velocity = Vector3.zero;
  42. isMove = false;
  43. animator.SetBool("Run", isMove);
  44. }
  45. }
  46. // 攻击状态
  47. if (isAttack)
  48. {
  49. animator.SetBool("Attack", isAttack);
  50. isAttack = false;
  51. }
  52. }
  53. void Run()
  54. {
  55. // 处理点击w前移逻辑
  56. if (Input.GetKey(KeyCode.W))
  57. {
  58. //记录下目标点
  59. targetPos = new Vector3(transform.localPosition.x, transform.localPosition.y, transform.localPosition.z + 1);
  60. // 转向
  61. transform.LookAt(targetPos);
  62. //改变移动State
  63. isMove = true;
  64. }
  65. // 处理点击a左移逻辑
  66. if (Input.GetKey(KeyCode.A))
  67. {
  68. //记录下目标点
  69. targetPos = new Vector3(transform.localPosition.x - 1, transform.localPosition.y, transform.localPosition.z);
  70. // 转向
  71. transform.LookAt(targetPos);
  72. //改变移动State
  73. isMove = true;
  74. }
  75. // 处理点击s后移逻辑
  76. if (Input.GetKey(KeyCode.S))
  77. {
  78. //记录下目标点
  79. targetPos = new Vector3(transform.localPosition.x, transform.localPosition.y, transform.localPosition.z - 1);
  80. // 转向
  81. transform.LookAt(targetPos);
  82. //改变移动State
  83. isMove = true;
  84. }
  85. // 处理点击D右移逻辑
  86. if (Input.GetKey(KeyCode.D))
  87. {
  88. // 记录下目标点
  89. targetPos = new Vector3(transform.localPosition.x + 1, transform.localPosition.y, transform.localPosition.z);
  90. // 转向
  91. transform.LookAt(targetPos);
  92. // 改变移动状态
  93. isMove = true;
  94. }
  95. // 处理攻击事件
  96. if (Input.GetKey(KeyCode.J))
  97. {
  98. //设置trigger
  99. animator.SetTrigger("Attack");
  100. }
  101. }
  102. }

总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/728892
推荐阅读
相关标签
  

闽ICP备14008679号