项目02《游戏-04-开发》Unity3D

基于      项目02《游戏-03-开发》Unity3D      ,

因前三集资源以及代码冗余问题,本次项目对前三集进行了重做,资源及代码如下,

首先导入场景及人物资源,

为人物添加动画控制器Animator组件,

创建动画控制器文件夹ACs,并在ACs文件夹下创建Animation Controller命名为PlayerAC角色动画控制器,

0层动画控制器:

1层动画控制器:

2层动画控制器:

创建好角色动画控制器后,将PlayerAC绑定在场景中Player的Animator上,

接下来添加新输入系统,

角色移动(包括跳跃,镜头旋转)

角色攻击(包括连击)

绑定MainGame.cs

双击MainGame.cs修改脚本:

using UnityEngine;
public class MainGame : MonoBehaviour{
    public static Player player;
    void Awake(){
        player = GameObject.Find("Player").GetComponent<Player>();
    }
}

绑定摄像机跟随代码:

双击CameraCtrl.cs修改脚本:

using UnityEngine;
public class CameraCtrl : MonoBehaviour{
    public float dis;
    public float height;
    public float speed;
    Transform target;
    Vector3 targetPos;
    void Start(){
        target = MainGame.player.transform;
    }
    void Update(){
        transform.LookAt(target.position + Vector3.up * 1.5f);
        targetPos = target.forward * (-dis) + target.up * height + target.position;
    }
    void LateUpdate(){
        transform.position = Vector3.Lerp(transform.position, targetPos, speed);
    }
}
保存代码后回到unity场景设置数值:

创建角色基类Living.cs:

双击Living.cs脚本,

using UnityEngine;
public class Living : MonoBehaviour{
    public Animator Anim { get; set; }
    protected virtual void InitValue() {
        Anim = GetComponent<Animator>();
    }
    protected void Start(){
        InitValue();
    }
}
创建角色类Player.cs:

双击Player.cs修改脚本:

using UnityEngine;
using UnityEngine.InputSystem;
public class Player : Living{
    float speed = 3;
    float rotate;
    bool isHoldRotate;//保持旋转角度
    void Start(){
        base.Start();
        SetInput();
        contro = GetComponent<CharacterController>();
    }
    CharacterController contro;
    Controls action;
    void SetInput(){
        action = new Controls();
        action.Enable();
        action.PlayerCtrl.Move.started += Move;
        action.PlayerCtrl.Move.performed += Move;
        action.PlayerCtrl.Move.canceled += StopMove;
        action.PlayerCtrl.Jump.started += Jump;
        action.PlayerCtrl.Rotate.started += Rotate;
        action.PlayerCtrl.Rotate.performed += Rotate;
        action.PlayerCtrl.HoldRotate.performed += HoldRotate;
        action.PlayerCtrl.HoldRotate.canceled += HoldRotate;
        action.PlayerAtt.SwordOut.started += SwordOut;
        action.PlayerAtt.Att.started += Attack;
    }
    void Attack(InputAction.CallbackContext obj){
        if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight")){
            Anim.SetInteger("AttackID", 1);
            Anim.SetTrigger("AttackTrigger");
        }
        else{
            int num = Anim.GetInteger("AttackID");
            if (num == 6)
                return;
            if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Attack_" + num))
                Anim.SetInteger("AttackID", num + 1);
        }
    }
    void SwordOut(InputAction.CallbackContext obj){
        Anim.SetBool("IsSwordOut", !Anim.GetBool("IsSwordOut"));
    }
    void HoldRotate(InputAction.CallbackContext obj){
        if (obj.phase == InputActionPhase.Canceled)
            isHoldRotate = false;
        else
            isHoldRotate = true;
    }
    void Rotate(InputAction.CallbackContext obj){
        rotate = obj.ReadValue<float>();
    }
    void Jump(InputAction.CallbackContext obj){
        Anim.SetTrigger("JumpTrigger");
    }
    void StopMove(InputAction.CallbackContext obj){
        Anim.SetBool("IsRun", false);
    }
    void Move(InputAction.CallbackContext obj){
        Anim.SetBool("IsRun", true);
    }
    void Ctrl(){
        if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Sprint") ||
         Anim.GetCurrentAnimatorStateInfo(0).IsName("Run") ||
         Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_ver_A") ||
         Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight")){
            float f = action.PlayerCtrl.Move.ReadValue<float>();
            contro.Move(transform.forward * f * Time.deltaTime * speed);
            contro.Move(transform.up * -9.8f * Time.deltaTime);
            if (isHoldRotate)
                transform.Rotate(transform.up * rotate * 0.3f);
        }
    }
    void Update(){
        Ctrl();
    }
}
回到Unity中查看绑定在Player角色身上的脚本Player.cs

添加角色控制器组件,Character Controller

运行项目W/S键执行前后移动,右键控制前进方向,

空闲状态:

战斗状态:按E

鼠标左键连击,

鼠标左键一次,

鼠标左键两次,

鼠标左键三次,

鼠标左键四次,

鼠标左键五次,

战斗状态移动,W/S + 鼠标右键控制视角,

按E,解除战斗状态,

非战斗状态移动,

跳跃,空格键

战斗状态空格键是前滚,

测试完成,

End.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/452995.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法与数据结构】583、72、LeetCode两个字符串的删除操作+编辑距离

文章目录 一、583、两个字符串的删除操作二、72、编辑距离三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、583、两个字符串的删除操作 思路分析&#xff1a;本题的思路和115、不同的子序列差不多&#xff0c;只是变成…

C#获取当前CPU,内存使用详情及常用WMI查询语句

1&#xff0c;获取当前CPU使用率&#xff08;需添加System.Management.dll&#xff09;&#xff1a; string queryStr "select * from win32_processor";System.Management.ManagementObjectSearcher searcher new System.Management.ManagementObjectSearcher(qu…

【MATLAB源码-第132期】基于matlab的淘金优化算法(GRO)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 淘金优化算法&#xff08;GoldRush Optimizer&#xff0c;简称GRO&#xff09;是一种启发式优化算法&#xff0c;它受到淘金过程的启发。在淘金过程中&#xff0c;淘金者在河流或矿区中寻找金矿&#xff0c;通过筛选沙砾来寻…

数据库学习笔记2024/2/4

随笔 1. 为什么学? 认识数据,熟悉数据,掌握数据。 进企业必备技能。 2. 怎么学? 1、MySQL数据库就是存储和管理数据的一个大型软件,这个软件有一个专门的语言叫SQL,主要学的是SQL语言,但想要达到企业用人标准,就还得学会熟练使用MySQL这个软件。 2、学习分三阶段: 一. …

mysql:事务的特性ACID、并发事务(脏读、不可重复读、幻读、如何解决、隔离级别)、undo log和redo log的区别、相关面试题和答案

事务是一组操作的集合&#xff0c;它会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 事务的特性&#xff08;ACID&#xff09; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务是不可分割的…

Angular BaseView抽离页面公用属性

前言 如果有一系列的页面布局很类似&#xff0c;为了节省时间&#xff0c;我们可以把这些类似的页面所通用的属性和方法抽离成一个BaseView&#xff0c;让其它页面继承该基础页面&#xff0c;同时将一些经常改变的属性和差异的属性写到配置文件里。例如树容器初始时是否展开、…

问题:下列哪些属于历史文化资源的特征( ). #学习方法#学习方法

问题&#xff1a;下列哪些属于历史文化资源的特征( ). A、稀缺性 B、脆弱性 C、可再生性 D、多样性 参考答案如图所示

C语言KR圣经笔记 7.1标准输入和输出 7.2格式化输出-printf

第七章 输入和输出 输入和输出功能并不是 C 语言本身的一部分&#xff0c;故到目前为止&#xff0c;本书都没有对其着重说明。然而&#xff0c;程序与其环境之间交互的方式&#xff0c;比书中之前所展示的更为复杂。本章我们会详描述标准库&#xff0c;即一系列为 C 程序提供输…

Stable Diffusion 模型下载:国风3 GuoFeng3

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十推荐提示词下载地址模型介绍 欢迎使用GuoFeng3模型 - 这是一个中国华丽古风风格模型,也可以说是一个古风游戏角色模型,具有2.5D的质感。 条目内

数字人客服技术预研

技术洞察 引言 在当今数字化时代&#xff0c;不断进步和创新的人工智能&#xff08;AI&#xff09;技术已经渗透到各行各业中。随着AI技术、大模型技术逐步发展&#xff0c;使得数字人的广泛应用成为可能&#xff0c;本文将跟大家一起探讨AI数字人客服的概念、优势、应用场景…

【Java八股文面试系列】JVM-内存区域

目录 Java内存区域 运行时数据区域 线程独享区域 程序计数器 Java 虚拟机栈 StackFlowError&OOM 本地方法栈 线程共享区域 堆 GCR-分代回收算法 字符串常量池 方法区 运行时常量池 HotSpot 虚拟机对象探秘 对象的创建 对象的内存布局 句柄 Java内存区域 运…

使用WPS制作三线表

点击边框和底纹点击1、2、3、4并且应用于表格点击确定 再次选中表格点击右键表格属性选择边框和底纹 选中表格第一行右键点击表格属性选择边框和底纹 如果表格中存在虚线