• 【Unity3D】人物跟随鼠标位置


    1 游戏对象

            2D动画人体模型及动画中介绍了 Aniamtion、Animator、人体模型、人体骨骼、人体动画等基础知识,本文将通过 “人物跟随鼠标位置” 案例加强对 Unity3D 动画的理解。

            1)游戏界面

            2)游戏对象

            由于 Unity3D 官方人体模型(Ethan)皮肤是黑白的,不太美观,笔者使用了其他人体模型,资源见→Unity3D人物模型资源集合

    2 动画控制器

            1)创建动画控制器 

            在 Assets 窗口右键,依次选择【Create→AnimatorController】,创建动画控制器,并重命名为 AnimatorController。

            选中 Girl 对象,将 AnimatorController 拖拽到其 Animator 组件中,如下:

            2)构建动画状态机

            双击 AnimatorController 文件,打开 Animator 窗口。将 Unity3D 官方人体动画中 HumanoidIdle 和 HumanoidRun 2 个动画拖拽到 Animator 窗口。(在 Assets 窗口右键,依次选择【Import Package→Environment】导入资源库)。

             在动画状态 HumanoidIdle 上右键,弹出小窗口,选择 “Make Transition”,再左键单击动画状态 HumanoidRun ,就会创建一个从HumanoidIdle 指向 HumanoidRun 的连接线。用同样方法创建 HumanoidRun 指向 HumanoidIdle 的连接线。

             3)设置动画状态转换条件

            在 Animator 窗口依次选择【Parameters→ + → Int】,创建名为 Status 的变量,如下:

             选中 HumanoidIdle 指向 HumanoidRun 的连接线,在 Inspector 窗口单击 “+” 号,添加上文创建的 “Status” 变量,将条件修改为 Equals,取值修改为 1,不勾选 “Has Exit Time” 选项(允许 HumanoidIdle 动画被打断,当条件满足时,直接进入 HumanoidRun 动画)。

             使用同样的方法,给 HumanoidRun 指向 HumanoidIdle 的连接线添加状态转换条件,如下:

    3 脚本组件

            ActionController.cs

    1. using UnityEngine;
    2. public class ActionController : MonoBehaviour {
    3. private Animator animator;
    4. private Vector3 oldPos;
    5. private void Awake() {
    6. animator = GetComponent();
    7. oldPos = transform.position;
    8. }
    9. private void Update() {
    10. int status = GetAnimationState();
    11. animator.SetInteger("Status", status);
    12. oldPos = transform.position;
    13. }
    14. private int GetAnimationState() {
    15. if (Input.GetMouseButton(0)) { // 鼠标左键单击, 向鼠标位置奔跑
    16. Vector3 targetPos = GetTargetPos();
    17. if (targetPos == null || GetDistance(targetPos) < 0.5f) {
    18. transform.position = oldPos; // 原地踏步
    19. return 1;
    20. }
    21. transform.LookAt(targetPos); // 转向目标位置
    22. return 1;
    23. }
    24. return 0;
    25. }
    26. private Vector3 GetTargetPos() { // 获取目标位置
    27. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    28. RaycastHit hitInfo = new RaycastHit();
    29. Physics.Raycast(ray, out hitInfo);
    30. return hitInfo.point;
    31. }
    32. private float GetDistance(Vector3 targetPos) {
    33. return Vector3.Distance(transform.position, targetPos);
    34. }
    35. }

             说明:ActionController 脚本组件挂在 Girl 游戏对象上。

    4 运行效果

  • 相关阅读:
    【人工智能,机器学习,统计学习,科学表征】开源商用与研发合作
    Pycharm 远程连接服务器(ssh)运行深度学习代码 | 详细步骤
    数据结构 【树状数组】【线段树】【珂朵莉树】
    响应式编程-基本介绍
    华为无线设备WLAN QoS配置命令
    Talk | 马里兰大学博士生吴曦旸:分布式多智能体强化学习在复杂交通轨迹规划中的应用
    凉鞋的 Godot 笔记 108. 第二个通识:增删改查
    MySQL基础
    句法解析CoreNLPDependencyParser
    目标检测YOLO实战应用案例100讲-基于YOLOv5自适应损失权重的生活垃圾目标检测模型
  • 原文地址:https://blog.csdn.net/m0_37602827/article/details/126320143