找回密码
 立即注册
查看: 322|回复: 0

【Unity3D】人物跟随鼠标位置

[复制链接]
发表于 2023-3-2 15:24 | 显示全部楼层 |阅读模式
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
using UnityEngine;public class ActionController : MonoBehaviour {    private Animator animator;    private Vector3 oldPos;    private void Awake() {        animator = GetComponent<Animator>();        oldPos = transform.position;    }    private void Update() {        int status = GetAnimationState();        animator.SetInteger("Status", status);        oldPos = transform.position;    }    private int GetAnimationState() {        if (Input.GetMouseButton(0)) { // 鼠标左键单击, 向鼠标位置奔跑            Vector3 targetPos = GetTargetPos();            if (targetPos == null || GetDistance(targetPos) < 0.5f) {                transform.position = oldPos; // 原地踏步                return 1;            }            transform.LookAt(targetPos); // 转向目标位置            return 1;        }        return 0;    }    private Vector3 GetTargetPos() { // 获取目标位置        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);        RaycastHit hitInfo = new RaycastHit();        Physics.Raycast(ray, out hitInfo);        return hitInfo.point;    }    private float GetDistance(Vector3 targetPos) {        return Vector3.Distance(transform.position, targetPos);    }}
说明:ActionController 脚本组件挂在 Girl 游戏对象上。
4 运行效果


声明:本文转自【Unity3D】人物跟随鼠标位置

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 14:32 , Processed in 0.090075 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表