学习游戏制作记录(剑投掷技能)7.26

1.实现瞄准状态和接剑状态

准备好瞄准动画,投掷动画和接剑动画,并设置参数AimSword和CatchSword

投掷动画在瞄准动画后,瞄准结束后才能投掷

创建PlayerAimSwordState脚本和PlayerCatchSwordState脚本并在Player中初始化:

PlayerAimSwordState脚本:

        if(Input.GetKeyDown(KeyCode.Mouse1))//鼠标右键
{
_PlayerStateMachine.ChangeState(_Player.idleState);
}//在Update中,用于调试

PlayerGroundedState脚本:

        if(Input.GetKeyDown(KeyCode.Mouse1))
{
_PlayerStateMachine.ChangeState(_Player.AimSword);
}

为SkillManage对象创建新脚本Sword_Skil并在SkillManage脚本中初始化它:

    [Header("Skill info")]
[SerializeField] private GameObject swordPrefab;//剑的预制体
[SerializeField] private Vector2 lanchForce;//剑的发射方向
[SerializeField] private float swordGravity;//剑的重力改变

2.实现剑的投掷(剑预制体的创建与代码调用)

创建剑的对象,你可以创建一个父对象和子对象来表示一把剑,子对象负责挂载动画组件,父对象负责挂载刚体碰撞器等。

为其添加旋转和待机动画,并添加rotation参数用来控制动画

Skill脚本:

    protected Player player { get; private set; }//实例化Player,方便调用


    protected virtual void Start()
{
player = PlayerManage.instance.player;
}

为剑预制体添加Sword_Skill_Control脚本:

    private Animator anim;
private Rigidbody2D rb;
private CircleCollider2D cd;

    private Player player;

    private void Awake()
{
anim = GetComponent<Animator>();
rb = GetComponent<Rigidbody2D>(); 
cd = GetComponent<CircleCollider2D>();

}

    public void SetupSword(Vector2 _dir,float _gravityScale)//给生成的预制体一个力和重力的改变
{
rb.velocity = _dir;
rb.gravityScale = _gravityScale;
}

Sword_Skill脚本:

    public void CreateSword()
{
GameObject newSword = Instantiate(swordPrefab,player.transform.position,transform.rotation);在玩家位置创建剑对象

        Sword_Skill_Control newSkillScript =newSword.GetComponent<Sword_Skill_Control>();

        newSkillScript.SetupSword(lanchForce, swordGravity);
}

PlayerAniamtionTrigger脚本:

    private void ThrowSword()
{
SkillManage.instance.sword.CreateSword();
}//在玩家投掷动画中选择一帧添加事件来调用该函数

3.实现瞄准时方向点的生成

我们想要在玩家瞄准时随着鼠标移动展示不同的飞行轨迹并最终让剑沿着这条轨迹发射,这需要我们创建一个点的预制体,然后再游戏时生成很多个点,并套用公式让这些点排列成轨迹。

实现最终方向跟随鼠标:

Sword_Skill脚本:

private Vector2 finalDir;

    private Vector2 AnimDirection()
{
Vector2 playerPostion=player.transform.position;
Vector2 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector2 direction = mousePosition - playerPostion;//由玩家指向鼠标

        return direction;
}

    protected override void  Update()
{
if(Input.GetKeyUp(KeyCode.Mouse1))
{
finalDir = new Vector2(AnimDirection().normalized.x *lanchForce.x,AnimDirection().y *lanchForce.y);//normalized是归一化处理,你可以理解把向量压缩为1,乘以我们的初始方向即最终方向
}
}

    public void CreateSword()
{
GameObject newSword = Instantiate(swordPrefab,player.transform.position,transform.rotation);

        Sword_Skill_Control newSkillScript =newSword.GetComponent<Sword_Skill_Control>();

        newSkillScript.SetupSword(finalDir, swordGravity);//调用最终方向
}

实现瞄准点的排序:

    [Header("AnimDots info")]
[SerializeField] private int numbersofDots;//生成点的数量
[SerializeField] private float spaceBetweenTwoDots;//每个点间隔的时间
[SerializeField] private GameObject dotPrefab;//点的预制体,自行创建,记得更改图层为地面
[SerializeField] private Transform dotsParent;//自行在玩家下创建一个子对象,作为生成所有点的父对象

    private GameObject[] dots;//生成点的数组

    private void GenerateDots()//生成所有点
{
dots = new GameObject[numbersofDots];
for (int i = 0; i < numbersofDots; i++)
{
dots[i]=Instantiate(dotPrefab,player.transform.position,Quaternion.identity,dotsParent);
dots[i].SetActive(false);
}
}

    protected override void Start()//调用上述函数
{
base.Start();

        GenerateDots();
}

    public void DotsActove(bool _isActive)//设置点是否可见
{
for(int i = 0; i < dots.Length; i++)//循环
{
dots[i].SetActive(_isActive);
}
}

    private Vector2 DotsPosition(float t)//返回每个点的位置
{
Vector2 position = (Vector2)player.transform.position + new Vector2(AnimDirection().normalized.x * lanchForce.x, AnimDirection().y * lanchForce.y) * t
+ .5f * (Physics2D.gravity * swordGravity) * (t * t);

//位置 = 初始位置 + 初速度 × 时间 + 0.5 × 加速度 × 时间²

        return position;
}

    protected override void  Update()
{
if(Input.GetKeyUp(KeyCode.Mouse1))
{
finalDir = new Vector2(AnimDirection().normalized.x *lanchForce.x,AnimDirection().y *lanchForce.y);
}

        if(Input.GetKey(KeyCode.Mouse1))//按住鼠标右键时时刻更新这些点的位置
{
for(int i = 0; i < dots.Length; i++)
{
dots[i].transform.position = DotsPosition(i * spaceBetweenTwoDots);
}
}
}

PlayerAimSwordState脚本:

    public override void Enter()
{
base.Enter();

        SkillManage.instance.sword.DotsActove(true);
}

    public override void Exit()
{
base.Exit();

        SkillManage.instance.sword.DotsActove(false);
}//进入瞄准时可见这些点,退出消失

演示:

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

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

相关文章

【c++】问答系统代码改进解析:新增日志系统提升可维护性——关于我用AI编写了一个聊天机器人……(14)

在软件开发中&#xff0c;代码的迭代优化往往从提升可维护性、可追踪性入手。本文将详细解析新增的日志系统改进&#xff0c;以及这些改进如何提升系统的实用性和可调试性。一、代码整体背景代码实现了一个基于 TF-IDF 算法的问答系统&#xff0c;核心功能包括&#xff1a;加载…

visual studio2022编译unreal engine5.4.4源码

UE5系列文章目录 文章目录 UE5系列文章目录 前言 一、ue5官网 二.编译源码中遇到的问题 前言 一、ue5官网 UE5官网 UE5源码下载地址 这样虽然下载比较快,但是不能进行代码git管理,以后如何虚幻官方有大的版本变动需要重新下载源码,所以我们还是最好需要visual studio2022…

vulhub Earth靶场攻略

靶场下载 下载链接&#xff1a;https://download.vulnhub.com/theplanets/Earth.ova 靶场使用 将压缩包解压到一个文件夹中&#xff0c;右键&#xff0c;用虚拟机打开&#xff0c;就创建成功了&#xff0c;然后启动虚拟机&#xff1a; 这时候靶场已经启动了&#xff0c;咱们现…

Python训练Day24

浙大疏锦行 元组可迭代对象os模块

Spring核心:Bean生命周期、外部化配置与组件扫描深度解析

Bean生命周期 说明 程序中的每个对象都有生命周期&#xff0c;对象的创建、初始化、应用、销毁的整个过程称之为对象的生命周期&#xff1b; 在对象创建以后需要初始化&#xff0c;应用完成以后需要销毁时执行的一些方法&#xff0c;可以称之为是生命周期方法&#xff1b; 在sp…

日语学习-日语知识点小记-进阶-JLPT-真题训练-N1阶段(1):2017年12月-JLPT-N1

日语学习-日语知识点小记-进阶-JLPT-真题训练-N1阶段&#xff08;1&#xff09;&#xff1a;2017年12月-JLPT-N1 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰&#xff08;3&#xff09;真题训练2、真题-2017年12月-JLPT-N1&#xff08;1&a…

(一)使用 LangChain 从零开始构建 RAG 系统|RAG From Scratch

RAG 的主要动机 大模型训练的时候虽然使用了庞大的世界数据&#xff0c;但是并没有涵盖用户关心的所有数据&#xff0c; 其预训练令牌&#xff08;token&#xff09;数量虽大但相对这些数据仍有限。另外大模型输入的上下文窗口越来越大&#xff0c;从几千个token到几万个token,…

OpenCV学习探秘之一 :了解opencv技术及架构解析、数据结构与内存管理​等基础

​一、OpenCV概述与技术演进​ 1.1技术历史​ OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是由Intel于1999年发起创建的开源计算机视觉库&#xff0c;后来交由OpenCV开源社区维护&#xff0c;旨在为计算机视觉应用提供通用基础设施。经历20余年发展&…

什么是JUC

摘要 Java并发工具包JUC是JDK5.0引入的重要并发编程工具&#xff0c;提供了更高级、灵活的并发控制机制。JUC包含锁与同步器&#xff08;如ReentrantLock、Semaphore等&#xff09;、线程安全队列&#xff08;BlockingQueue&#xff09;、原子变量&#xff08;AtomicInteger等…

零基础学后端-PHP语言(第二期-PHP基础语法)(通过php内置服务器运行php文件)

经过上期的配置&#xff0c;我们已经有了php的开发环境&#xff0c;编辑器我们继续使用VScode&#xff0c;如果是新来的朋友可以看这期文章来配置VScode 零基础学前端-传统前端开发&#xff08;第一期-开发软件介绍与本系列目标&#xff09;&#xff08;VScode安装教程&#x…

扩散模型逆向过程详解:如何从噪声中恢复数据?

在扩散模型中&#xff0c;逆向过程的目标是从噪声数据逐步恢复出原始数据。本文将详细解析逆向条件分布 q(zt−1∣zt,x)q(\mathbf{z}_{t-1} \mid \mathbf{z}_t, \mathbf{x})q(zt−1​∣zt​,x)的推导过程&#xff0c;揭示扩散模型如何通过高斯分布实现数据重建。1. 核心问题 在…

2025年7月份实时最新获取地图边界数据方法,省市区县街道多级联动【文末附实时geoJson数据下载】

动态生成最新行政区划 GeoJSON 数据并结合 ECharts 实现地图下钻功能 在开发基于地图的数据可视化应用时&#xff0c;一个常见的挑战是获取准确且最新的行政区划边界数据&#xff08;GeoJSON&#xff09;。许多现有的在线资源可能数据陈旧&#xff0c;无法反映最新的行政区划调…

Spark实现WorldCount执行流程图

spark可以分区并行执行&#xff0c;同时并行执行也可以基于内存完成迭代代码对于大部分spark程序来说都是以driver开始driver结束&#xff0c;中间都是executor分布式运行

编程与数学 03-002 计算机网络 02_网络体系结构与协议

编程与数学 03-002 计算机网络 02_网络体系结构与协议一、网络体系结构的基本概念&#xff08;一&#xff09;分层体系结构的优点&#xff08;二&#xff09;协议、接口与服务的概念二、OSI参考模型&#xff08;一&#xff09;七层模型的层次划分及功能&#xff08;二&#xff…

Flutter 提取图像主色调 ColorScheme.fromImageProvider

从图像中提取主色调&#xff0c;用于动态适配颜色主题或者界面颜色。之前在 Flutter 应用里一直用的 palette_generator 插件&#xff0c;可以分析图像颜色&#xff0c;从中提取一系列主要的色调。最近发现这个谷歌官方的插件竟然不维护了&#xff0c;后续没有更新计划了。 查找…

51c自动驾驶~合集8

自己的原文哦~ https://blog.51cto.com/whaosoft/11618683 #Hierarchical BEV BEV进入定制化时代&#xff01;清华Hierarchical BEV&#xff1a;创新多模块学习框架&#xff0c;无痛落地无缝量产&#xff01;​ 论文思路 自动驾驶指通过传感器计算设备、信息通信、自…

Excel——重复值处理

识别重复行的三种方法方法1&#xff1a;COUNTIF公式法在E2单元格输入公式&#xff1a;COUNTIF($B$2:$B2,B2)>1下拉填充至所有数据行结果为TRUE的即为重复行&#xff08;会标出第二次及以后出现的重复项&#xff09;方法2&#xff1a;排序IF公式法按商机号排序&#xff08;数…

华普微Matter模块HM-MT7201,打破智能家居生态孤岛

随着智能家居渗透率与认可度的持续提升&#xff0c;消费者对于智能家居的功能诉求正从具备联网控制、远程控制与语音遥控等基础交互能力&#xff0c;升级为能通过单一的家居生态平台APP无缝控制所有的品牌设备&#xff0c;从而实现真正意义上的统一调度。这种从“单一设备联网控…

如何使用 minio 完成OceanBase社区版的归档和备份

自OceanBase社区版4.2.1BP7版本起&#xff0c;OceanBase的归档与备份功能开始兼容AWS S3及S3协议的对象存储服务&#xff0c;因此&#xff0c;许多用户选择采用 MinIO 作为其备份存储介质。因为 MinIO 兼容AWS S3云存储服务接口&#xff0c;成为了一个轻便的服务选项。 本文将…

Nacos-服务注册,服务发现(二)

Nacos健康检查 两种健康检查机制 Nacos作为注册中⼼, 需要感知服务的健康状态, 才能为服务调⽤⽅提供良好的服务。 Nacos 中提供了两种健康检查机制&#xff1a; 客⼾端主动上报机制&#xff1a; 客⼾端通过⼼跳上报⽅式告知服务端(nacos注册中⼼)健康状态, 默认⼼跳间隔5…