Unity——2D小游戏笔记整理

news2024/12/26 13:21:49

【每日一句:清晨和夜晚都请用尽全力去生活】

目录

一、环境搭建

二、人物

三、相机跟随人物移动

四、平铺精灵

五、血条跟随敌人行走

六、脚本逻辑

【玩家行走方法】

【玩家跳跃方法】

【改变玩家血量值方法】

【创建玩家子弹方法】

【主角血量,改变血条遮罩】

【敌人(减血物体)触发检测,调用玩家改变血量值方法ChangeHealth(int amount)】

【敌人来回移动代码】

【改变敌人血量方法EnemyChangeHealth() 引用敌人血量脚本EnemyHealth EnemySetValue(currentHealth / (float)maxHealth);】


一、环境搭建

1.瓦片地图Tilemaps

创建 2DObject——>Tilemap——>Rectangular

        Window——>2D——>Tile Palette

瓦片集 Sprite Mode从Single改为Multiple

             Pixel Per Unit值从100更改为64

2.添加瓦片地图碰撞:Tilemap Collider2D组件

选择的瓦片不再被视为碰撞体:在Inspector找到Collider Type属性,Sprite更改为None

优化瓦片地图碰撞体Composite Collider2D组件,会自动添加Rigidbody2D,在Tilemap Collider2D,启用Used By Composite

在Rigidbody2D,将Rigidbody Body Type属性设为Static

二、人物

动画

Right_Run——>Left_Run

单击Add Property,然后单击Sprite Render旁边的三角形,再单击Flip X旁边的+图标

使用混合树:

【待完善……】

【上下左右移动】

三、相机跟随人物移动

使用Cinemachine包

Window——>PackageManager——>Cinemachine

使用GameObject——>Cinemachine——>Virtual Camera

Cinemachine Virtual Camera组件

调整Orthgraphic Size(摄像机的一半高度内可容纳多少个单位);Follow 跟随主角

四、平铺精灵

1.首先确保游戏对象的缩放在Transform组件1:1:1

2.在SpriteRender组件中将Draw Mode设为Tiled,Tile Mode改为Adaptive

精灵的Inspector面板,Mesh Type改为Full Rect

血条跟随敌人行走

public class FollowBlood : MonoBehaviour

{

    public Transform player;

    public Image hp;

    public  Camera cam;

    void Update()

    {

        //把人物的坐标转化到屏幕坐标

        var playerScreenPos = cam.WorldToScreenPoint(player.position);

        //再把人物坐标Y加一个高度给到人物

        hp.rectTransform.position = new Vector2(playerScreenPos.x, playerScreenPos.y + 35f);

    }

   

}

六、脚本逻辑

【玩家行走方法】

void Movement()

    {

        float horizontal = Input.GetAxisRaw("Horizontal");

        rb.velocity = new Vector2(horizontal * speed, rb.velocity.y);

        Vector2 move = new Vector2(horizontal, 0);

        if (horizontal != 0)

        {

            //lookDir.Set(move.x, 0);

            lookDir.Normalize();

            ani.SetBool("IsSpeed",true);

        }

        else  if(horizontal == 0)

        {

            ani.SetBool("IsSpeed", false);

        }

        //Debug.Log(horizontal);

        if (horizontal > 0)

        {

            ani.SetFloat("LookX", 1);

        }

        else if (horizontal < 0)

        {

            ani.SetFloat("LookX", 0f);

        }

      

}

【玩家跳跃方法】

void Jump()

    {

        if (isGround)

        {

            jumpCount = 2;

        }

        if (isJump && isGround)

        {

            rb.velocity = new Vector2(rb.velocity.x, jumpForce);

            //jumpForce--;

            isJump = false;

        }

        else if (isJump && !isGround && jumpCount > 0)

        {

            rb.velocity = new Vector2(rb.velocity.x, jumpForce);

            jumpCount--;

            isJump = false;

        }

【改变玩家血量值方法】

public void ChangeHealth(int amount)

    {

        if (amount < 0)

        {

            if (isInvincible)

                return;

            isInvincible = true;

            invincibleTimer = timerInvincible;

        }

        currentHealth = Mathf.Clamp(currentHealth + amount, 0, maxHealth);

        UIHealth.instance.SetValue(currentHealth / (float)maxHealth);

        Debug.Log(currentHealth + "/" + maxHealth);

    }

【创建玩家子弹方法】

void CreatBullet()

    {

        GameObject bul = Instantiate(bullet, rb.position + Vector2.right * 0.5f,Quaternion.identity) as GameObject;

        Projectile proj = bul.GetComponent<Projectile>();

        proj.Launch(300);

    }

—————————————————————————————————————————

【主角血量,改变血条遮罩】

public class UIHealth : MonoBehaviour

{

    public static UIHealth instance

    {

        get;private set;

    }

    public Image mask;

    float originalSize;

    private void Awake()

    {

        instance = this;

    }

    // Start is called before the first frame update

    void Start()

    {

        originalSize = mask.rectTransform.rect.width;

    }

    public void SetValue(float value)

    {

        mask.rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, originalSize * value);

    }

}

【敌人(减血物体)触发检测,调用玩家改变血量值方法ChangeHealth(int amount)】

private void OnTriggerStay2D(Collider2D collision)

    {

        PlayerController controller = collision.GetComponent<PlayerController>();

        if (controller != null)

        {

            controller.ChangeHealth(-1);

        }

    }

【敌人来回移动代码

void Update()

    {

        timer -= Time.deltaTime;

        if (timer < 0)

        {

            direction = -direction;

            timer = changeTime;

        }

        if (direction == 1)

        {

            ani.SetBool("isLeft", true);

        }

        else

        {

            ani.SetBool("isLeft", false);

        }

}

private void FixedUpdate()

    {

        Vector2 position = rb.position;

        if (vertical)

        {

            position.y = position.y + Time.deltaTime * speed * direction;

        }

        else

        {

            position.x = position.x + Time.deltaTime * speed * direction;

        }

        rb.MovePosition(position);

    }

改变敌人血量方法EnemyChangeHealth() 引用敌人血量脚本EnemyHealth EnemySetValue(currentHealth / (float)maxHealth);

public void EnemyChangeHealth(int amount)

    {

      

        currentHealth = Mathf.Clamp(currentHealth + amount, 0, maxHealth);

        Debug.Log("敌人当前血量+" + currentHealth + amount);

        eh.EnemySetValue(currentHealth / (float)maxHealth);

        Debug.Log(currentHealth + "/" + maxHealth);

    }

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

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

相关文章

《计算机网络——自顶向下方法》精炼——3.7(1)

少而好学,如日出之阳;壮而好学,如日中之光;志而好学,如炳烛之光。——刘向 文章目录 拥塞控制方法ATM ABR拥塞控制 TCP拥塞控制TCP拥塞控制算法的实现慢启动拥塞避免快速恢复总结 拥塞控制方法 在上一篇文章中&#xff0c;我们介绍了在数据传输过程中出现的问题。本节将简要介…

Bitbucket 的SSH keys 突然无法识别 -> Permission denied (publickey)问题

Bitbucket 的SSH keys 突然无法识别 -> Permission denied (publickey)问题 用了几年的SSH keys突然出现Permission denied (publickey)问题&#xff0c;如下图所示&#xff1a; 1、首先排查项目权限问题&#xff0c;确认其他账号可更新代码&#xff0c;排除 2、排除SSH k…

【软件测试】白盒测试与黑盒测试

白盒测试与黑盒测试 测试用例定义生成的基本准测设计步骤作用测试数据和测试用例的区别 黑盒测试定义优点缺点黑盒测试的实施过程等价类划分法边界值分析法错误推测法因果图判定表判定表例题 白盒测试介绍覆盖程度基本路径覆盖程序流程图简化成控制流图计算圈复杂度导出测试用例…

chatGPT 学习笔记

学习笔记&#xff1a;chatGPT chatGPT 概述 什么是 chatGPT &#xff1f;(要说明定义、来源、功能和特点) ChatGPT 是 OpenAI 开发的一个大型预训练语言模型&#xff0c;它基于 GPT-3.5 模型&#xff0c;可以在对话中生成类似人类的文本响应&#xff0c;简称对齐。它使用自监…

基于节点分层的配网潮流前推回代方法【IEEE33节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

java的UDP(一)

文章目录 1. 简介2. UDP客户端3. UDP服务器4. DatagramPacket类 1. 简介 Java中的UDP实现分为两个类&#xff1a;DatagramPacket和DatagramSocket。DatagramPacket类将数据字节填充到UDP包汇总&#xff0c;这称为数据报&#xff0c;由你来解包接收的数据报。DatagramSocket可以…

2023北京大学首席营销官CMO高级研修班简介

【课程背景】自 2022 年以来&#xff0c;营销新趋势呈现以下变化&#xff1a;消费渠道多元化&#xff0c;社会化媒体 成为信息主要渠道&#xff0c;流量红利消失&#xff0c;数字营销成当下主流&#xff1a;元宇宙数字营销成热点&#xff1b;私域运营更受品牌重视&#xff1b;国…

MySQL主存复制

介绍 配置-主库master 第一步&#xff1a;修改MySQL数据库的配置文件/etc/my.cnf [mysqld] log-binmysql-bin #[必须]启用二进制日志 server-id100 #[必须]服务器唯一id第二部&#xff1a;重启MySQL服务 systemctl restart mysqld第三步&#xff1a;登录MySQL操作&#x…

Talk预告 | 新加坡国立大学张傲:10%成本定制类 GPT-4 多模态大模型

本期为TechBeat人工智能社区第502期线上Talk&#xff01; 北京时间06月01日(周四)20:00&#xff0c;新加坡国立大学在读博士生 — 张傲的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “10%成本定制类 GPT-4 多模态大模型 ”&#xff0c;届时将介…

RemoteSensing投稿流程

RemoteSensing投稿流程&#xff0c;底部有官网地址和word模板 RemoteSensing投稿流程&#xff0c;遇到的坑RemoteSensing期刊官网地址&#xff0c;模板 RemoteSensing投稿流程&#xff0c; ##3.16 Submit &#xff08;第一次提交&#xff09; 3.17 Under review &#xff08;正…

中核浦原一号数字员工诞生,实在智能为智能制造再添强大引擎

头戴博士帽&#xff0c;脚踩喷气引擎&#xff0c;身披“科技蓝”披风&#xff0c;今年的全国科技工作者日&#xff0c;一位硬“核”数字员工正式诞生&#xff01; 这就是由上海中核八所科技有限公司&#xff08;下称中核八所&#xff09;人工智能研发中心为上海中核浦原有限公司…

网工内推 | 上海网工专场,NP认证,朝九晚六,多次调薪机会

01 上海伍贤信息技术股份有限公司 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;职责描述&#xff1a; 1、在网络基础设施方面提供日常支持&#xff0c;例如&#xff0c;WIFI、局域网、视频会议等。 2、协助管理亚太地区的网络安全服务&#xff08;防火墙/代理/…

CVE-2023-33246 Apache RocketMQ 命令注入漏洞复现及分析

CVE-2023-33246 Apache RocketMQ 命令注入漏洞复现及分析 0x0.威胁情报&#xff1a; 漏洞编号CVE编号CVE-2023-33246漏洞评估危害评级高危漏洞类型RCE公开程度PoC已公开利用条件1.在受影响版本内威胁类型远程利用情报在野利用无漏洞活跃度中影响产品产品名称Apache RocketMQ受…

代码随想录算法训练营第二十四天| 回溯理论基础 、77. 组合

理论基础 回溯通常隐藏在递归函数的下面&#xff0c;递归和回溯是相辅相成的&#xff0c;通常来说 回溯函数就是指递归函数。 回溯法其实是一个纯暴力的搜索&#xff0c;有些问题只能依靠回溯法将所有的结果搜出来。 例如&#xff1a; 组合问题&#xff1a;N个数里面按一定规…

【VictoriaMetrics】VictoriaMetrics单机版数据删除

在使用vm的过程中,我们会遇到需要删除不必要的数据,那vm是如何操作数据删除的呢? VictoriaMetrics通过发送HTTP请求到http://<victoriametrics-addr>:8428/api/v1/admin/tsdb/delete_series?match=<timeseries_selector_for_delete> 其中<timeseries_sele…

npm+模块加载机制

1.npm与包 1.什么是包 Node.js中的第三方模块又叫做包。 就像电脑和计算机指的是相同的东西&#xff0c;第三方模块和包指的是同一个概念&#xff0c;只不过叫法不同。 2.包的来源 不同于Node,js中的内置模块与自定义模块&#xff0c;包是由第三方个人或团队开发出来的&am…

Android 应用弹出悬浮窗

Android开发者经常遇到应用想弹出悬浮窗的操作&#xff0c;而且有可能还想要高层级弹窗&#xff0c;就像ipone的浮标touch一样。android当然也有类似的悬浮图标&#xff0c;比如前些年我们的流量监控提醒。 这里我们忽略UI美学&#xff0c;简单记录一下&#xff1a; 1、基本使…

mac os 安装rz/sz

说明&#xff1a;使用rz sz实现终端的文件传输&#xff0c;该命令主要使用场景为 macos中通过堡垒机登陆后无法使用ftp工具传输文件。 工具&#xff1a;iTerm2、lrzsz、homebrew 以及两个脚本文件&#xff08;iterm2-recv-zmodem.sh、iterm2-send-zmodem.sh&#xff09; …

基于确定有穷自动机(DFA算法)实现敏感词过滤

1.DFA算法简介 DFA(Deterministic Finite Automaton) 是一种非递归自动机&#xff0c;也称为确定有穷自动机。它是通过event和当前的state得到nextstate&#xff0c;即eventstatenextstate。 确定&#xff1a;状态以及引起状态转换的事件都是可确定的。 有穷&#xff1a;状态以…

EBU6304 Software Engineering 知识点总结_4 analysis, design, implementation, testing

analysis 仅仅从用户的需求来看得到的消息不全面&#xff0c;还需要分析。用户可能认为你明白了&#xff0c;或者他考虑不全面&#xff0c;觉得一些地方是不需要的。 因此我们需要分析来 Refining requirements。 gather requirements-analyse in real world context-develo…