Unity2d-做一个横板动作小游戏

2023-11-21 20:20

本文主要是介绍Unity2d-做一个横板动作小游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习视频教程 无邪:
https://space.bilibili.com/335835274/channel/detail?cid=112338
无邪 教程

在这里插入图片描述

画个自己的像素人物
后续是给这个人物添加动画
在这里插入图片描述

直接将导出的png图片拖入Unity中,创建一个2d对象
把每个导入的动作分割成单独的16*16的图片,
多选中多张图片一起拖到对象上,则可給该对象创建动画
在这里插入图片描述

打开动画窗口 即可看到当前对象的所有动画
在动画界面中创建 几个全局变量来控制动画切换
在脚本代码中 获取该对象的动画组件 并通过判断player的动作 方向 来设置几个全局变量的值,理论上这几个全局变量一旦切换 动画就会根据逻辑对应的切换

   using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerController : MonoBehaviour
{public float MoveSpeed;private Animator Myanimator;private Rigidbody2D Myrigidbody2D;// Start is called before the first frame updatevoid Start(){MoveSpeed = 5;Myanimator = GetComponent<Animator>();Myrigidbody2D = GetComponent<Rigidbody2D>();}// Update is called once per framevoid Update(){PlayerMove();CheckPlayerDirectory();}void PlayerMove(){float MoveDirH = Input.GetAxis("Horizontal");float MoveDirV = Input.GetAxis("Vertical");Vector2 vector = new Vector2(MoveDirH * MoveSpeed, MoveDirV* MoveSpeed);Myrigidbody2D.velocity = vector;//if (Input.GetKey(KeyCode.W))//{//    gameObject.transform.Translate(Vector3.up * MoveSpeed * Time.deltaTime);//}//if (Input.GetKey(KeyCode.S))//{//    gameObject.transform.Translate(Vector3.down * MoveSpeed * Time.deltaTime);//}//if (Input.GetKey(KeyCode.A))//{//    gameObject.transform.Translate(Vector3.left * MoveSpeed * Time.deltaTime);//}//if (Input.GetKey(KeyCode.D))//{//    gameObject.transform.Translate(Vector3.right * MoveSpeed * Time.deltaTime);//}}void CheckPlayerDirectory(){if (Myrigidbody2D.velocity.x < 0){Myanimator.SetBool("IsMoveLeft", true);Debug.Log("IsMoveLeft -> true");}else{Myanimator.SetBool("IsMoveLeft", false);}/**************************************************************/if (Myrigidbody2D.velocity.x > 0){Myanimator.SetBool("IsMoveRight", true);}else{Myanimator.SetBool("IsMoveRight", false);}/**************************************************************/if (Myrigidbody2D.velocity.y > 0){Myanimator.SetBool("IsMoveUp", true);}else{Myanimator.SetBool("IsMoveUp", false);}/**************************************************************/if (Myrigidbody2D.velocity.y < 0){Myanimator.SetBool("IsMoveDown", true);}else{Myanimator.SetBool("IsMoveDown", false);}/**************************************************************/if (Mathf.Abs( Myrigidbody2D.velocity.y ) < Mathf.Epsilon && Mathf.Abs(Myrigidbody2D.velocity.x) < Mathf.Epsilon){Myanimator.SetBool("IsMoveDown", true);}}

向左走和向右走 可以共享同一个动画
具体做法是判断 角色的运动方向 并在脚本里面选择是否反转角色
代码如下

transform.localRotation = Quaternion.Euler(0,180,0);

最终还是决定做个横板跳跃游戏
人物绘制如下
在这里插入图片描述

一个会跳跃的小至尊宝,名字叫做Hx
在这里插入图片描述

做一个简易场景,给Hx的脚部添加Box Collider 2d组件 使得其能站在地面上
给Hx的身体部分添加Capsule Collider 2d 使其能和其他物体产生碰撞

添加脚本控制人物移动 和 判断人物当前运动状态 切换不同的动画
代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class HxControl : MonoBehaviour
{public float MoveSpeed;public bool IsAdministrator;private Rigidbody2D myrigibody;private Animator myAnimator;// Start is called before the first frame updatevoid Start(){MoveSpeed = 5;myrigibody = GetComponent<Rigidbody2D>();myAnimator = GetComponent<Animator>();//IsAdministrator = false;}// Update is called once per framevoid Update(){Run();Jump();CheckAnimotion();}private void Run(){float MoveDir = Input.GetAxis("Horizontal");Vector2 vector2 = new Vector2(MoveDir*MoveSpeed,myrigibody.velocity.y);myrigibody.velocity = vector2;}private void Jump(){if (myAnimator.GetBool("IsHxJump") || myAnimator.GetBool("IsHxFly")){}else{if (Input.GetButtonDown("Jump")){Vector2 vector2 = new Vector2(myrigibody.velocity.x, MoveSpeed * 1.4f);myrigibody.velocity = vector2;}}//确认为超级管理员 则可以随便飞if (IsAdministrator){if (Input.GetButtonDown("Jump")){Vector2 vector2 = new Vector2(myrigibody.velocity.x, MoveSpeed * 1.4f);myrigibody.velocity = vector2;}}}private void CheckAnimotion(){if (Mathf.Abs(myrigibody.velocity.x) < Mathf.Epsilon && Mathf.Abs(myrigibody.velocity.y) < Mathf.Epsilon){myAnimator.SetBool("IsHxJump", false);myAnimator.SetBool("IsHxRun", false);myAnimator.SetBool("IsHxFly", false);}else{if (Mathf.Abs(myrigibody.velocity.y) > Mathf.Abs(Mathf.Epsilon)){if (myrigibody.velocity.y > Mathf.Epsilon){myAnimator.SetBool("IsHxJump", true);}if (myrigibody.velocity.y < -Mathf.Epsilon){myAnimator.SetBool("IsHxFly", true);}}else{myAnimator.SetBool("IsHxFly", false);myAnimator.SetBool("IsHxJump", false);if (myrigibody.velocity.x < -Mathf.Epsilon){myAnimator.SetBool("IsHxRun", true);transform.localRotation = Quaternion.Euler(0, 0, 0);}if (myrigibody.velocity.x > -Mathf.Epsilon){myAnimator.SetBool("IsHxRun", true);transform.localRotation = Quaternion.Euler(0, 180, 0);}}}}}

添加攻击动画
理论上来说攻击可以从任意状态触发,则动画流程图如下
在这里插入图片描述

攻击状态可以从any state出现,动画结束后又可以回到之前的状态
攻击动画选用Triger类型的变量触发
触发代码为

    private void Acttack(){if (Input.GetButtonDown("Attack")){myAnimator.SetTrigger("IsHxAttack");Debug.Log("IsHxAttack");}}

攻击状态下添加HitBox
在这里插入图片描述

在Hx下新建一个空的子对象 名字叫HxAttack
在HxAttack下面 添加组件 Polygon Colloder 2d 多边形碰撞组件 取消该组件前的复选框
添加脚本:判断当攻击按键按下时 使能碰撞组件,并一定时间后禁用碰撞组件
脚本代码如下:

    public int DamdgeVal;private Animator animator;private PolygonCollider2D polygonCollider;// Start is called before the first frame updatevoid Start(){animator = GameObject.FindGameObjectWithTag("Player").GetComponent<Animator>();polygonCollider = GetComponent<PolygonCollider2D>();}// Update is called once per framevoid Update(){}void Attack(){if (Input.GetKeyDown("Attack")){polygonCollider.enabled = true;StartCoroutine(DisableHitBox());}}IEnumerator DisableHitBox(){yield return new WaitForSeconds(0.6f);polygonCollider.enabled = false;}

攻击效果实现
创建一个物体,这里我创建了一截树干
在这里插入图片描述

给树干添加Box Collider 2d 碰撞检测框

/// <summary>/// 怪物的血量/// </summary>public int healthVal;/// <summary>/// 怪物的伤害值/// </summary>public int damageVal;/// <summary>/// /// </summary>private SpriteRenderer sr;/// <summary>/// the base Color of The Enemy/// </summary>private Color OriginColor;

脚本代码中 添加以上变量

    public void Start(){sr = GetComponent<SpriteRenderer>();OriginColor = sr.color;}

获取树干的精灵组件,将原始颜色赋值给变量

    public void Update(){if (healthVal <= 0){Destroy(gameObject);}}

每一帧判断自身血量,若血量归零 则摧毁这个对象

public void TaskDamage(int damage){this.healthVal -= damage;Instantiate(BloodEffect,transform.position,Quaternion.identity);FlashColor(0.3f);}void FlashColor(float conTime){sr.color = Color.red;Invoke("ResetColor", conTime);}void ResetColor(){sr.color = OriginColor;}

新增public 受到攻击的函数 供外部对象调用
受到攻击后自身生命值减少/
初始化一个外部传进来的GameObject(这是外面写好的一个粒子特效,用作掉血效果)/
自身的颜色切换成Color.Red并延时0.3s后恢复原来的颜色

而在Hx代码块内 新增攻击函数如下:

    private void OnTriggerEnter2D(Collider2D other){if (other.gameObject.CompareTag("Enemy")){other.GetComponent<Enemy>().TaskDamage(DamdgeVal);}}

若Hx的攻击范围 进入了某个Collider内,则函数内进行判断 碰撞到的Collider是否属于Enemy标签的
如果属于 则调用该Enemy的TaskDamage()函数 即攻击完成;


瓦片绘制功能

在Aseprinte中绘制6432的图像,单个3232为一个基本单元
绘制两块地面并导出图像至Unity切割;
完毕后 在场景中创建TitleMap对象,则在Grid中存在TitleMap对象,打开Title Palette窗口,将切割好的模块拖进去,即可在场景中绘制
在这里插入图片描述

绘制完成后需要给场景里面的TitleMap对象添加碰撞体 TitleMap Collider 2d
并添加Composite Collider 2d组件,添加这个碰撞组件之后会自动带一个Rigibody组件,将Rigibody组件中BodyType设置为Static,表明
这个对象是一个静态的对象,不受重力作用;

这些设置完毕之后 开启工程,发现在该TitleMap移动的时候 Y方向上有个很小的速度 在正负变换,我是通过Y方向上速度的正负来判断人物是
在跳起来上升阶段 还是处于下落阶段,并更改不同的动画,所以这时候判断就不能直接大于零或者小于零,应该大于0.1或者小于-0.1;
在这里插入图片描述

地图绘制完毕后,发现角色可以爬墙,也就是在竖直的碰撞体上,只要你一直向着墙的方向移动,则不会掉下来,此时Y方向上的速度也为0,跳跃的条件我设置的是
Y方向上速度大于0.1或者小于-0.1,此时Y方向上速度为0,则可以再次跳跃,此时就达到的爬墙的效果,虽然是一个BUG 不过准备保留,用于进入一些隐藏的关卡;

绘制了初始场景的地图 如下:
在这里插入图片描述

计划这里为一个选择关卡的场景
左边第一位置为攀大场景,后续根据情况再添加;
在中间靠上的位置 设置了一个牛头随机移动,后续准备做成 在平台上击打一个对象,则开启牛头的移动,没有什么作用,隐藏彩蛋。

这篇关于Unity2d-做一个横板动作小游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/404868

相关文章

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

jsp技术(内置对象,动作标签,指令)

一、 九大对象:   内置对象(又叫隐含对象,有9个内置对象):不需要预先声明就可以在脚本代码和表达式中随意使用   1-out:   javax.servlet.jsp.JspWriter类型,代表输出流的对象。作用域为page(页面执行期)   request:javax.servlet.ServletRequest的子类型,此对象封装了由WEB浏览器或其它客户端生成地HTTP

Unity3D ARPG(动作角色扮演游戏)设计与实现详解

动作角色扮演游戏(Action Role-Playing Game, ARPG)结合了传统角色扮演游戏(RPG)的深度与动作游戏(Action Game)的即时反应和流畅战斗体验。Unity3D 作为一款强大的跨平台游戏开发引擎,为开发者提供了丰富的工具和资源来创建高质量的 ARPG 游戏。本文将详细介绍如何使用 Unity3D 设计和实现一个基本的 ARPG 游戏,包括技术选型、游戏架构、关键系

贪吃蛇的小游戏--用C语言实现

贪吃蛇的小游戏–用C语言实现 游戏背景 贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。 实现基本的功能: • 贪吃蛇地图绘制 • 蛇吃⻝物的功能 (上、下、左、右⽅向键控制蛇的动作) • 蛇撞墙死亡 • 蛇撞⾃⾝死亡 • 计算得分 • 蛇⾝加速、减速 • 暂停游戏 技术要点 C语⾔函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32

用于基于骨架的动作识别的空间时间图卷积网络 ST-GCN (代码+数据集+模型)

简介 本仓库包含论文《用于基于骨架的动作识别的空间时间图卷积网络》的相关代码、数据集和模型。 ST-GCN 动作识别演示 我们的基于骨架的动作识别演示展示了ST-GCN如何从人体骨架中提取局部模式和关联性。下图显示了我们ST-GCN最后一层中每个节点的神经响应幅度。 触摸头部 坐下 脱鞋 进食 投踢他人 掷锤 清洁与抓举 拉力器 太极拳 抛球 上一行结果来自NTU-RGB+D数据集,第

MFC对话框贪吃蛇小游戏

花了近一个月的时间,学习了一下VC++深入详解,做了个贪吃蛇小游戏,虽然有很多的瑕疵,但还是想分享一下战果。 说一下思路: ①我们要绘制图形,我们可以用CClientDC(客户区设备上下文,与特定的窗口关联)声明一个dc对象作图。 当然这里我们要画蛇的身体和食物,设置一个食物类和蛇身体结构体 ②我们如何让图形动起来?SetTimer创建一个计时器,KillTimer()用来销毁计时器

GameFi生存法则:从巨头争霸到小游戏革命,掀起区块链游戏的全新风暴

随着区块链技术的飞速发展,GameFi(游戏与去中心化金融的结合)正成为加密世界的一个重要领域。然而,随着时间的推移,这一领域也经历了显著的演变,从最初的3A大作到如今流行的Telegram小游戏,这种变化不仅反映了市场需求的转变,也揭示了GameFi如何在生存与繁荣之间找到平衡。 一、GameFi 的演变:从 3A 大作到 Telegram 小游戏 不同类型 GameFi 项目的优劣 Ga

14、Django Admin的“Action(动作)”中添加额外操作

如图红框增加操作 将以下代码添加到HeroAdmin类中 actions = ["mark_immortal"]def mark_immortal(self, request, queryset):queryset.update(is_immortal=True) 修改后完整代码如下: @admin.register(Hero)class HeroAdmin(admin.Model

Unity实战案例 2D小游戏HappyGlass(模拟水珠)

本案例素材和教程都来自Siki学院,十分感谢教程中的老师 本文仅作学习笔记分享交流,不作任何商业用途 预制体   在这个小案例中,水可以做成圆形但是带碰撞体,碰撞体比图形小一圈,顺便加上Trail renderer组件   材质 将碰撞材质的friction为0,bonciness可以按照需要修改 脚本  生成水珠的脚本并不难, 只是需要创建大量实例化对象的时候,加一个携程

UNO小游戏2

前言 hello,大家好我是文宇。最近也是抽出时间更一期了。 bug还是很多(恼),所以就当个乐子看看,反正后面还会有的,先把这玩意儿发了再说。 正文 #include<bits/stdc++.h>#include<windows.h>using namespace std;bool can = 1;int colorsz1[25];int cardsz1[25];int co