2D横板跳跃游戏笔记(查漏补缺ing...)

1.Compression(压缩质量):可以改为None,不压缩的效果最好,但占用内存

2.Filter Mode(过滤模式):可以选择Point(no filter)

3.Pixels Per Unit:是每个方格所容纳的像素个数

4.切割图集要选择Sprite Mode 为 Multiple

注:Pivot(锚点)也就是图片中心轴

5.在Preferences中的Tile Palette中可以添加更多快捷功能。

6.在animator中的每个animation,可以点击Add Behaviour可以创建该类脚本,进行代码控制。

7.动画脚本写设置动画的函数,然后用其他脚本中调用,Trigger单独调用,Int/float/bool在动画脚本的update中更新。

8.Layer Override Priority是代表碰撞优先级,越高越会优先碰撞。

9.关于数值一般需要两个:maxValue与currentValue。

10.继承关系的父类可以写成虚函数,通过子类进行覆写。

public virtual void Move()
{//父类方法
}
override public void Move()
{base.Move();//依然使用父类中的方法,只是增加新的//子类覆写方法
}

11.如果只是在子父之间使用的变量可以使用protected修饰符 。

12.如果合并的碰撞体无法检测,可以调整Composite Collider 2D中Geometry Type为Polygons。

13.自动添加必需的组件添加可以使用:

[RequireComponent(typeof(Rigidbody2D))]

14.cinemachine中的confiner2D每次获取都需要清理缓存(InvalidateCache)

15.多设备的管理需要使用InputSystem库中的方法进行操作。

16.管理者一般只有一个,被管理者有多个。

17.调用不同物体的相同接口执行不同方法,接口中的方法不需要实现。

18.使用SO写的事件,可以使用激活UnityEvent的方式来呼叫执行事件。

19.攻击执行逻辑

        1)Attack(攻击者)

public class Attack : MonoBehaviour
{public int damage;public float attackRange;public float attackRate;//攻击频率private void OnTriggerStay2D(Collider2D other){other.GetComponent<Character>()?.TakeDamage(this);}
}

        2)Character(被攻击者)

public void TakeDamage(Attack attacker)
{if (currentHealth - attacker.damage > 0){currentHealth -= attacker.damage;}else{currentHealth = 0;}
}

具体逻辑:实际执行血量减少逻辑实在被攻击者中,攻击者主要起到通知的作用。 

20.数据保存逻辑

        1)保存接口(需要保存数据的代码调用接口)

public interface ISaveable
{DataDefination GetDataID();void RegisterSaveData(){DataManager.instance.RigisterSaveData(this);} void UnRegisterSaveData() => DataManager.instance.UnRegisterSaveData(this);void GetSaveData(Data data);void LoadData(Data data);
}

        2) 数据管理者

public class DataManager : MonoBehaviour
{public static DataManager instance;[Header("事件监听")]public VoidEventSO saveDataEvent;public VoidEventSO loadDataEvent;private List<ISaveable> saveableList = new ();private Data saveData;private void Awake(){if(instance == null)instance = this;elseDestroy(gameObject);saveData = new Data();}private void Update(){if (Keyboard.current.lKey.wasPressedThisFrame){Load();}}private void OnEnable(){saveDataEvent.OnEventRaised += Save;loadDataEvent.OnEventRaised += Load;}private void OnDisable(){saveDataEvent.OnEventRaised -= Save;loadDataEvent.OnEventRaised -= Load;}public void RigisterSaveData(ISaveable saveable){if (!saveableList.Contains(saveable)){saveableList.Add(saveable);}}public void UnRegisterSaveData(ISaveable saveable){saveableList.Remove(saveable);}public void Save(){foreach (var saveable in saveableList){saveable.GetSaveData(saveData);}foreach (var item in saveData.characterPosDict){Debug.Log(item.Key + " : " + item.Value);}}public void Load(){foreach (var saveable in saveableList){saveable.LoadData(saveData);}}
}

        3) 数据唯一识别ID

public class DataDefination : MonoBehaviour
{public PersistentType persistentType;public string ID;private void OnValidate(){if (persistentType == PersistentType.ReadWrite){if(ID == string.Empty)ID = System.Guid.NewGuid().ToString();}else{ID = string.Empty;}}
}

        4)数据

public class Data
{public string sceneToSave;public Dictionary<string,Vector3> characterPosDict = new ();public Dictionary<string,float> floatSaveData = new ();public GameSceneSO GetSaveScene(){var newScene = ScriptableObject.CreateInstance<GameSceneSO>();return newScene;}
}

 具体逻辑:一个脚本需要数据保存与读取,需要调用接口,实现里面的方法并且注册(卸载)注

                   册表,然后管理者在数据保存和加载时一次调用注册表里的对象执行每个里面对应的

                   保存与加载方法。

                   数据会存入Data的每个字典中,每个字典分别由ID与存储数据构成,那么每个脚本挂

                   载的物体都需要生成唯一可识别ID。

21.Addressable的异步加载

        1.场景切换管理

    public Transform playerTrans;public Vector3 firstPosition;public Vector3 menuPosition;[Header("场景")]public GameSceneSO firstLoadScene;public GameSceneSO menuScene;[Header("事件广播")]public VoidEventSO afterSceneLoadedEvent;public FadeEventSO fadeEvent;public SceneLoadEventSO unLoadedEvent;public GameSceneSO currentloadScene;private GameSceneSO sceneToLoad;private Vector3 posToGo;private bool isLoading;private void OnBackToMenuEvent(){sceneToLoad = menuScene;loadEventSO.RaiseLoadRequestEvent(sceneToLoad,menuPosition,true);}private void NewGame(){sceneToLoad = firstLoadScene;loadEventSO.RaiseLoadRequestEvent(sceneToLoad,firstPosition,true);}//加载场景前置工作private void OnLoadRequestEvent(GameSceneSO locationToGo, Vector3 posToGo, bool fadeScreen){if(isLoading)return;isLoading = true;sceneToLoad = locationToGo;this.posToGo = posToGo;this.fadeScreen = fadeScreen;if(currentloadScene != null)StartCoroutine(UnLoadPreviousScene());elseLoadNewScene();}//卸载之前场景private IEnumerator UnLoadPreviousScene(){unLoadedEvent.LoadRequestEvent(sceneToLoad, posToGo, fadeScreen);//等待当前场景完全卸载yield return currentloadScene.sceneReference.UnLoadScene();LoadNewScene();}//加载新的场景private void LoadNewScene(){//加载场景并且场景为激活状态var loadingOption = sceneToLoad.sceneReference.LoadSceneAsync(LoadSceneMode.Additive);loadingOption.Completed += OnLoadComplete;}//加载完成之后执行任务private void OnLoadComplete(AsyncOperationHandle<SceneInstance> obj){currentloadScene = sceneToLoad;playerTrans.position = posToGo;isLoading = false;if(currentloadScene.sceneType != SceneType.Menu)afterSceneLoadedEvent.RaiseEvent();}

        2.场景SO

[CreateAssetMenu(menuName = "Game Scene/GameSceneSO", fileName = "GameSceneSO")]
public class GameSceneSO : ScriptableObject
{public SceneType sceneType;public AssetReference sceneReference;
}

        3.每个场景都需要勾选Addressable,添加进入Addressable Groups里面。

22.可交互逻辑

        1.交互接口

public interface IInteractable
{void TriggerAction();
}

        2.可交互逻辑

public class Chest : MonoBehaviour,IInteractable
{public void TriggerAction(){Debug.Log("Open Chest!");}
}

        3.玩家交互逻辑 

public class Sign : MonoBehaviour
{private IInteractable targetItem;private bool canPress;private void OnTriggerStay2D(Collider2D other){if (other.CompareTag("Interactable")){targetItem = other.GetComponent<IInteractable>();canPress = true;}}private void OnTriggerExit2D(Collider2D other){canPress = false;}private void OnConfirm(InputAction.CallbackContext obj){if (canPress && targetItem != null){targetItem.TriggerAction();}}
}

注:获取可交互物体对应的接口,然后执行接口函数,就会执行不同物体的不同方法。

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

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

相关文章

MAD-TD: MODEL-AUGMENTED DATA STABILIZES HIGH UPDATE RATIO RL

ICLR 2025 spotlight paper 构建能够在少量样本下学习出优良策略的深度强化学习&#xff08;RL&#xff09;智能体一直是一个极具挑战性的任务。为了提高样本效率&#xff0c;近期的研究尝试在每获取一个新样本后执行大量的梯度更新。尽管这种高更新-数据比&#xff08;UTD&am…

Dia浏览器:AI驱动浏览网页,究竟怎么样?(含注册申请体验流程)

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、Dia浏览器简介1. 什么是Dia浏览器2. 开发背景与公司简介3. 与传统浏览器的区别 …

SSL/TLS 证书与数字签名:构建互联网信任的详解

在浩瀚的数字世界中&#xff0c;信任是安全通信的基石。当我们通过浏览器访问一个 HTTPS 网站、进行在线支付&#xff0c;或者下载一个重要的软件更新时&#xff0c;我们如何能确信自己正在与合法的、未被仿冒的对方进行交互&#xff1f;我们又如何能保证传输的数据没有被中途窃…

近日部署跑通的若干多模态模型总结与论文概述

CLIP模型概述与落地测试 CLIP模型全称是Contrastive Language-Image Pretraining​​&#xff08;对比语言图像预训练&#xff09;。是OpenAI于2021年提出的多模态预训练模型&#xff0c;通过对比学习对齐图像和文本的表示&#xff0c;实现零样本&#xff08;zero-shot&#x…

Web3 初学者的第一个实战项目:留言上链 DApp

目录 &#x1f4cc; 项目简介&#xff1a;留言上链 DApp&#xff08;MessageBoard DApp&#xff09; &#x1f9e0; 技术栈 &#x1f536; 1. Solidity 智能合约代码&#xff08;MessageBoard.sol&#xff09; &#x1f537; 2. 前端代码&#xff08;index.html script.js…

LeetCode 270:在二叉搜索树中寻找最接近的值(Swift 实战解析)

文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 在日常开发中&#xff0c;我们经常需要在一组有序的数据中快速找到最接近某个目标值的元素。LeetCode 第 270 题“Closest Binary Search Tree Value”正是这样一个问题。本文将深入解析该…

Kotlin高阶函数多态场景条件判断与子逻辑

Kotlin高阶函数多态场景条件判断与子逻辑 fun main() {var somefun: (Int, Float) -> Longval a 4val b 5fsomefun multi()//if 某条件println(somefun.invoke(a, b))//if 某条件somefun add()println(somefun.invoke(a, b)) }fun multi(): (Int, Float) -> Long {re…

嵌入式学习--江协51单片机day4

昨天周五没有学习&#xff0c;因为中午没有睡觉&#xff0c;下午和晚上挤不出整块的时间。周日有考试今天也没有学很多啊&#xff0c;但以后周末会是学一天&#xff0c;另一天休息和写周总结。 今天学了串口通信和LED点阵屏&#xff0c;硬件原理是真的很迷&#xff0c;一但想搞…

Spring Cloud 以Gateway实现限流(自定义返回内容)

前言 Spring Cloud Gateway自带RequestRateLimiterGatewayFilterFactory限流方案&#xff0c;可基于Redis和RedisRateLimiter实现默认算法为令牌桶的请求限流。作为自带的该限流方案&#xff0c;其可与Spring生态的其它各项组件无缝集成&#xff0c;并且自身实现也相对完善/好用…

容器填充函数fill和memset对比总结

文章目录 1、fill() 按元素填充2、memset() 按字节填充3、对比 1、fill() 按元素填充 用于将容器或数组的指定范围内的元素赋值为指定值&#xff08;按元素类型填充&#xff09;。属于 C STL 算法&#xff08;<algorithm> 头文件&#xff09;。 // 从起始地址到结束地址…

【Linux实践系列】:进程间通信:万字详解共享内存实现通信

&#x1f525; 本文专栏&#xff1a;Linux Linux实践项目 &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 人生就像一场马拉松&#xff0c;重要的不是起点&#xff0c;而是坚持到终点的勇气 ★★★ 本文前置知识&#xff1a; …

CogView4 文本生成图像

CogView4 文本生成图像 flyfish 基于 CogView4Pipeline 的图像生成程序&#xff0c;其主要目的是依据 JSON 文件里的文本提示信息来生成图像&#xff0c;并且把生成的图像保存到指定文件夹。 JSON 文件格式 [{"prompt": "your first prompt"},{"pr…

路由重发布

路由重发布 实验目标&#xff1a; 掌握路由重发布的配置方法和技巧&#xff1b; 掌握通过路由重发布方式实现网络的连通性&#xff1b; 熟悉route-pt路由器的使用方法&#xff1b; 实验背景&#xff1a;假设学校的某个分区需要配置简单的rip协议路由信息&#xff0c;而主校…

机器人领域和心理学领域 恐怖谷 是什么

机器人领域和心理学领域 恐怖谷 是什么 恐怖谷是一个在机器人领域和心理学领域备受关注的概念,由日本机器人专家森政弘于1970年提出。 含义 当机器人与人类的相似度达到一定程度时,人类对它们的情感反应会突然从积极变为消极,产生一种毛骨悚然、厌恶恐惧的感觉。这种情感…

Go-GJSON 组件,解锁 JSON 读取新姿势

现在的通义灵码不但全面支持 Qwen3&#xff0c;还支持配置自己的 MCP 工具&#xff0c;还没体验过的小伙伴&#xff0c;马上配置起来啦~ https://click.aliyun.com/m/1000403618/ 在 Go 语言开发领域&#xff0c;json 数据处理是极为常见的任务。Go 标准库提供了 encoding/jso…

数据分析_数据预处理

1 数据预处理流程 ①数据清洗:处理数据缺失、数据重复、数据异常等问题,提升数据质量. ②数据转换:涵盖基本数据转换、语义数据转换、衍生数据转换和隐私数据转换,适配分析需求. ③数据集成:整合多源数据. 2 数据清洗 2.1 数据缺失 2.1.1 数值型数据缺失 数值型列的部分数值不…

vue +xlsx+exceljs 导出excel文档

实现功能&#xff1a;分标题行导出数据过多&#xff0c;一个sheet表里表格条数有限制&#xff0c;需要分sheet显示。 步骤1:安装插件包 npm install exceljs npm install xlsx 步骤2&#xff1a;引用包 import XLSX from xlsx; import ExcelJS from exceljs; 步骤3&am…

ThinkPad T440P如何从U盘安装Ubuntu24.04系统

首先制作一个安装 U 盘。我使用的工具是 Rufus &#xff0c;它的官网是 rufus.ie &#xff0c;去下载最新版就可以了。直接打开这个工具&#xff0c;选择自己从ubuntu官网下载Get Ubuntu | Download | Ubuntu的iso镜像制作U盘安装包即可。 其次安装之前&#xff0c;还要对 Thi…

第十七次博客打卡

今天学习的内容是动态规划算法。 动态规划算法&#xff08;Dynamic Programming&#xff0c;简称 DP&#xff09;是一种通过将复杂问题分解为更小的子问题来求解的算法思想。它主要用于解决具有重叠子问题和最优子结构特性的问题。 一、动态规划的基本概念 1. 最优子结构 一个复…

视觉革命来袭!ComfyUI-LTXVideo 让视频创作更高效

探索LTX-Video 支持的ComfyUI 在数字化视频创作领域&#xff0c;视频制作效果的提升对创作者来说无疑是一项重要的突破。LTX-Video支持的ComfyUI便是这样一款提供自定义节点的工具集&#xff0c;它专为改善视频质量、提升生成速度而开发。接下来&#xff0c;我们将详细介绍其功…