项目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.mzph.cn/news/664898.shtml

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

相关文章

人工智能基础-matplotlib基础

绘制图形 import numpy as np x np.linspace(0, 10, 100) y np.sin(x) import matplotlib as mpl import matplotlib.pyplot as plt plt.plot(x, y) plt.show()绘制多条曲线 siny y.copy() cosy np.cos(x) plt.plot(x, siny) plt.plot(x, cosy) plt.show()设置线条颜色 …

Jasperreport 生成 PDF之省纸模式

省纸模式顾名思义就是节省纸张&#xff0c;使用 Jasper 去生成 PDF 的时候如果进行分组打印的时候&#xff0c;一页 A4 纸只会打印一组数据。这种情况下&#xff0c;如果每组数据特别少&#xff0c;只有几行&#xff0c;一页 A4 纸张根本用不了&#xff0c;就会另起一页继续打印…

【傻瓜式教程】docker运行facechain

首选&#xff0c;为了防止后期docker满&#xff0c;Docker容器 - 启动报错&#xff1a;No space left on device&#xff0c;更换一下docker存储位置 1、停止Docker服务 首先停止Docker守护进程&#xff0c;可以使用以下命令&#xff1a; sudo systemctl stop docker 备份现有…

旧衣物回收小程序开发,互联网模式下的营收有多大?

在当下快节奏的生活中&#xff0c;人们不仅生活水平在提高&#xff0c;消费水平也在逐渐提高&#xff0c;从而导致了闲置衣物的增加。为了减少浪费&#xff0c;旧衣服回收行业受到了大众的广泛关注&#xff0c;成为循环利用的一大方式。 当然&#xff0c;在当下网络时代&#…

时间复杂度为 O(n) 的排序算法

大家好&#xff0c;我是 方圆。本文介绍线性排序&#xff0c;即时间复杂度为 O(n) 的排序算法&#xff0c;包括桶排序&#xff0c;计数排序和基数排序&#xff0c;它们都不是基于比较的排序算法&#xff0c;大家重点关注一下这些算法的适用场景。 桶排序 桶排序是分治策略的一…

kingbase控制文件重建

背景&#xff1a; 测试版本&#xff1a;V008R006C005B0023 sys_control文件在数据目录的global下 若sys_control文件损坏或被删&#xff0c;会导致库无法启动 处理方式&#xff1a; 所在目录为数据目录 1、尝试dryrun touch global/sys_control sys_resetwal -l 00000001…

Jenkins任意文件读取漏洞(CVE-2024-23897)复现

Jenkins 有一个内置的命令行界面CLI&#xff0c;在处理 CLI 命令时Jenkins 使用args4j 库解析 Jenkins 控制器上的命令参数和选项。此命令解析器具有一个功能&#xff0c;可以将参数中后跟文件路径的字符替换为文件内容 ( expandAtFiles)。具有Overall/Read权限的攻击者可以读取…

PeakCAN连接到WSL2 Debian

操作步骤 按照以下步骤进行操作&#xff1a; 在Windows下安装PeakCAN驱动并安装&#xff0c;地址是https://www.peak-system.com/PCAN-USB.199.0.html?&L1 在Windows下安装usbipd&#xff0c;地址是https://github.com/dorssel/usbipd-win/releases&#xff0c;最新版是…

小米服务治理——客户端熔断器(Google SRE客户端熔断器)

目录 前言 一、什么是Google SRE熔断器 二、Google SRE 熔断器的工作流程&#xff1a; 三、客户端熔断器 (google SRE 熔断器) golang GRPC 实现 四、客户端熔断器 (google SRE 熔断器) golang GRPC单元测试 大家可以关注个人博客&#xff1a;xingxing – Web Developer …

nest.js实现登录验证码功能(学习笔记)

安装express-session npm i express-session 引入 注册session import * as session from express-session;import { NestFactory } from nestjs/core; import {DocumentBuilder,SwaggerModule, } from nestjs/swagger;import { AppModule } from ./app.module;async functio…

解决iCloud备份显灰问题的完全指南

目录 ​编辑 引言 问题背景 可能的原因 1 网络连接问题 2 ICloud账户异常 3 存储空间不足 4 备份设置问题 5 iOS版本问题 解决方法 3.1 检查网络连接 3.2 检查ICloud账户 3.3 检查存储空间 3.4 检查备份设置 3.5 更新iOS版本 3.6 重启设备 3.7 重置ICloud设置 …

CSC联合培养博士申请亲历|联系外导的详细过程

在CSC申报的各环节中&#xff0c;联系外导获得邀请函是关键步骤。这位联培博士同学的这篇文章&#xff0c;非常详细且真实地记录了申请过程、心理感受&#xff0c;并提出有益的建议&#xff0c;小编特推荐给大家参考。 2024年国家留学基金委公派留学项目即将开始&#xff0c;其…

简单说说redis分布式锁

什么是分布式锁 分布式锁&#xff08;多服务共享锁&#xff09;在分布式的部署环境下&#xff0c;通过锁机制来让多客户端互斥的对共享资源进行访问/操作。 为什么需要分布式锁 在单体应用服务里&#xff0c;不同的客户端操作同一个资源&#xff0c;我们可以通过操作系统提供…

【计网·湖科大·思科】实验六 IP数据报的发送和转发流程、默认路由和特定主机路由

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

用 Easysearch 帮助大型车企降本增效

最近某头部汽车集团需要针对当前 ES 集群进行优化&#xff0c;背景如下&#xff1a; ES 用于支撑包括核心营销系统、管理支持系统、财务类、IT 基础设施类、研发、自动驾驶等多个重要应用&#xff0c;合计超 50 余套集群&#xff0c;累计数据超 1.5PB 。 本文针对其中一个 ES 集…

Compose | UI组件(十二) | Lazy Layout - 列表

文章目录 前言LazyListScope作用域 用来干什么&#xff1f;LazyColumn组件含义&#xff1f;LazyColumn的基本使用LazyColumn Padding设置边距LazyColumn 设置边距 (contentPadding)LazyColumn 为每个子项设置边距 (Arrangement.spacedBy())LazyColumn 根据 rememberLazyListSta…

a-upload——实现上传功能——基础积累

最近在写后台管理系统&#xff0c;遇到了上传功能&#xff0c;之前写过很多次&#xff0c;再次记录一下&#xff1a; <a-upload:file-list"fileList":remove"handleRemove":before-upload"beforeUpload":customRequest"customRequest&qu…

计算机毕业设计 | SSM 旅游网站后台管理系统(附源码)

1&#xff0c;概述 1.1 背景分析 随着人们生活水平的提高和对休闲旅游的日益重视&#xff0c;旅游业已成为全球最大的经济产业之一。越来越多的人选择通过在线方式进行旅行预订&#xff0c;这种趋势为旅游网站提供了巨大的商机。用户体验是决定旅游网站成功与否的关键因素。良…

Flutter 仿抖音 TikTok 上下滑动 播放视频

Flutter 仿抖音 TikTok 上下滑动 播放视频UI框架&#xff0c;视频播放使用 video_player github&#xff1a;GitHub - PangHaHa12138/TiktokVideo: Flutter 仿抖音 TikTok 上下滑动 播放视频UI框架 实现功能&#xff1a; 1.上下滑动自动播放切换视频&#xff0c;loading 封面…

bash脚本学习笔记

一、扫盲 脚本文件是一种文本文件&#xff0c;其中包含了一系列的命令和指令&#xff0c;可以被操作系统解释器直接解释执行。脚本文件通常被用来完成特定的任务或执行重复性的操作。 脚本文件通常以某种编程语言的语法编写&#xff0c;例如 Bash、Python、Perl、Ruby 等等。…