Unity 2D RPG索敌攻击练习

这篇具有很好参考价值的文章主要介绍了Unity 2D RPG索敌攻击练习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概要

Unity 2D demo 记录一下,主要涉及攻击索敌回顾练习
跟着这个up主操作的

【2023 Unity 2D RPG 保姆级 手把手 零基础教学|一个半小时做RPG】 https://www.bilibili.com/video/BV1Xj411r7Mm/?share_source=copy_web&vd_source=2b3bda5fbc53ad83b94e92f54b9ed017
相关软件版本 Unity Editor 2023.3.17

1 资源收集

Unity store中 中两个免费2D资源
unity索敌,unity,unity,游戏引擎

2 地图地形创建

2.1 创建项目

新建2D核心模版的项目
unity索敌,unity,unity,游戏引擎

2.2 在项目中导入下载的资源

Windows-Package Manager窗口,将保存好的资源下载并导入
unity索敌,unity,unity,游戏引擎

2.3 添加地形

  • Hierarchy窗口新建一个2D-Tilemap-Rectangular,并命名为ground,此对象为游戏地面的图层
  • 打开Tile Palette窗口,几个调色板已经随资源导入创建了,可以直接使用进行绘画地图
    unity索敌,unity,unity,游戏引擎

2.4 加个房子

  • 在Hierarchy窗口创建长方形的Tilemap,和创建ground方法相同,命名为house和plant,并将house和plant拖动至ground下,层级Order in Layer设置为1,在ground之上显示

  • 在Palette窗口新建一个palette可以命名为ground(随意)

  • 使用下载好的资源中sunny Land中的房子资源和树资源,检查资源单图为single mode,多图为multiple,过滤模式为point ,压缩compression 为none

  • 将房子资源拖动至Palette中,即可进行绘制
    unity索敌,unity,unity,游戏引擎

  • 将Palette窗口中的树和房子分别拖动到创建的图层上,调整位置大小
    unity索敌,unity,unity,游戏引擎

2.5 添加组件

  • 给house和plant添加组件,组合碰撞器Composite Collider;Rigidbody2D组件中的Body type设置为静止static;添加Tilemap Collider组件勾选used By Composite
    unity索敌,unity,unity,游戏引擎

2.6 设置围墙补充些建筑

  • 和house plant方法一样,新建命名为wall的Tilemap,wall的图层Order在1,plant改为2
  • 在Palette中选择墙的图片绘制到wall对象上
  • 增加组合碰撞体组件,将刚体组件Rigidbody2D的类型改为静止
  • 增加一些house中的素材和plant中的素材补充场景
    unity索敌,unity,unity,游戏引擎

3 角色移动动画脚本

补充资源

导入Dungeon中sprites下human的图片资源
unity索敌,unity,unity,游戏引擎

3.1 创建人物

  • Hierarchy窗口创建2DObject-sprite-square,命名为Player

  • Inspector窗口选择标签tag为player

  • Inspector窗口进行设置player,选择sprite后面的小圆圈,搜索素材player idle的图片添加上去

  • 翻转Flip选中 x轴

  • 新创建图层player,将游戏对象Player的所在图层选在player

  • 调整到合适的位置和大小
    unity索敌,unity,unity,游戏引擎

  • 补充 上面Layer所在图层也创建并选择为player
    unity索敌,unity,unity,游戏引擎

3.2 Player组件添加及设置

  • 添加Rigidbody2D组件,Gravity scale设置为0,设置锁定z轴

  • 添加碰撞体组件Box Collider2D,调整碰撞体大小
    unity索敌,unity,unity,游戏引擎

  • 在package Manager窗口中搜索input System组件进行下载安装,安装过程中会进行重启一下
    unity索敌,unity,unity,游戏引擎

  • 给Player添加input System组件,点击创建创建,里面是一些默认的用户输入的对应获取,使用时可以通过OnMove、OnFire等方法获取用户输入的信息
    unity索敌,unity,unity,游戏引擎

3.3 Player的相关动画

  • 创建player的idle静止动画、walk动画、attack动画、die动画
  • 静止和走动动画都设置为循环
  • 走动动画的素材是所有方向的,这里只选取向右走的素材即可
  • die动画在动画结束的最后添加两个property属性的改变,sprite render enable使其不可见,Rigidbody simulate是受力效果消失
    unity索敌,unity,unity,游戏引擎
  • 编辑动画控制器,添加三个参数完善动画之间的转换,一个bool类型的isWalk,true 时转换为walk动画,false时转换为idle动画;Trigger类型的isDie,触发时执行Die动画;Trigger类型的isAttack,触发时执行attack动画
  • 编辑转换过渡,将exit time都不选(attack到静止和行走的两个例外),过渡时间为0,条件一一对应,attack到静止和行走的两个连接线,仍保持有exit time,exit time设置为1,过渡时间为0,让其展示完一个完整的攻击动画在进行下一个动画的转换

unity索敌,unity,unity,游戏引擎

3.4 Player添加脚本

创建C#脚本并命名为PlayerMovement
代码如下

using System.Collections;
using System.Collections.Generic;
using Unity.Burst.Intrinsics;
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerMovement : MonoBehaviour
{
    private Rigidbody2D rb;
    private SpriteRenderer sprite;

    private Vector2 inputMove;
    private Animator anim;
    public float moveSpeed;

    private void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
        sprite = GetComponent<SpriteRenderer>();
        anim = GetComponent<Animator>();

    }

    private void OnMove(InputValue input)
    {
        inputMove = input.Get<Vector2>();
        if(inputMove == Vector2.zero)
        {
            anim.SetBool("isWalk", false);
        }
        else
        {
            anim.SetBool("isWalk", true);
            if (inputMove.x > 0)
            {
                sprite.flipX = true;//x轴运动大于0时,不进行翻转
               
            }
            if (inputMove.x < 0)
            {
                sprite.flipX = false;//沿x轴运动小于0时,进行翻转
               
            }
        }
    }
    private void FixedUpdate()
    {
        rb.AddForce(inputMove * moveSpeed);
    }

    private void OnFire()
    {
        anim.SetTrigger("isAttack");
    }

}

脚本保存并将脚本添加到Player对象上,修改速度为100,在Rigidbody组件中修改对象的质量mass和阻力linear drag
unity索敌,unity,unity,游戏引擎

3.5 镜头追随

  • Windows-package Manager中找到Cinematic Studio 点击安装
    unity索敌,unity,unity,游戏引擎
  • 安装后在Hierarchy窗口,创建一个cinematic-2DCamera
  • 在Follow处选择Player,如果执行镜头太小,调整lens Size的值
    unity索敌,unity,unity,游戏引擎

3.6 Player效果总结

此时Player对象可以随着wasd移动方向行走,鼠标点击为攻击效果动画

4 加个小怪兽

4.1 创建小怪兽

  • Hierarchy窗口创建2DObject -sprite-square命名为eagle
  • 找到eagle资源图片,在sprite处替换
  • 调整位置大小

4.2 添加组件

  • 添加Collider碰撞体组件
  • 创建一个图层animal,并将eagel选中到新创建的图层
  • 添加Rigidbody2D组件,重力为0,锁定z轴
    unity索敌,unity,unity,游戏引擎

4.3 创建动画

  • 资源中有eagle的三个动画,选中拖到asset下创建的Animation文件夹下的eagle文件夹中,将动画拖动给eagle对象
  • 调整动画控制器的条件,去掉过渡时间,存在时间等,加入条件isDive、isIdle、isHurt
    unity索敌,unity,unity,游戏引擎

4.4 加入脚本

创建eagle移动脚本EagleMovement,将脚本添加给eagle对象使其生效
脚本内容如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EagleMovement : MonoBehaviour
{
    public float viewRadius;//侦查的半径值
    public LayerMask playerMask;//侦查涉及的图层
    public Collider2D detectObj; //侦查到的碰撞体



    Rigidbody2D rb;
    Animator anim;
    SpriteRenderer sprite;
    public float speed;

    public int knockbackForce;//攻击力度

    private void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
        sprite = GetComponent<SpriteRenderer>();
    }

    private void FixedUpdate()
    {
       Collider2D coll = Physics2D.OverlapCircle(transform.position, viewRadius, playerMask); //检测方法,检测指定位置周围的圆形区域内是否存在碰撞器
        if (coll != null)
        {
            detectObj = coll;
            anim.SetTrigger("isDive");
            Vector2 direction = coll.transform.position - transform.position;
            if (direction.magnitude <=viewRadius)
            {
                rb.AddForce(direction * speed);
                if (direction.x > 0)
                {
                    sprite.flipX = true;//x轴运动大于0时,不进行翻转
                }
                if (direction.x < 0)
                {
                    sprite.flipX = false;//沿x轴运动小于0时,进行翻转
                }
                anim.SetTrigger("isDive");
            }
            else
            {
                anim.SetBool("isIdle", true);
            }
            

        }

    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        Collider2D collider = collision.collider;
        //Debug.Log("player OnCollisionEnter2D"+collider.tag);
        if (collider != null && collider.tag == "Player")
        {
            //Debug.Log("player inter");
            Vector3 vector3 = collision.transform.position - transform.position;
            collider.GetComponent<Rigidbody2D>().AddForce(vector3 * knockbackForce);
      
        }
    }

    private void OnDrawGizmos()
    {
        Gizmos.DrawWireSphere(transform.position, viewRadius);
    }
}



将脚本添加给eagle对象,并设置速度力度等相关参数
unity索敌,unity,unity,游戏引擎

4.5 存为预制体

在Assets文件夹下创建prefab文件夹,将Eagle对象从Hierarchy窗口拖至文件夹下,存为预制体,需要时直接拖动至屏幕中,所有设置不变
unity索敌,unity,unity,游戏引擎

4.6 Eagle效果总结

此时eagle对象可以侦查player对象的移动,当进入侦查半径,将追随player移动,当接触到player时会产生攻击击飞player效果

5 我削小怪兽

5.1 加个武器

  • 给player对象的图片素材暂时改为有武器且正在使用的图片
  • 在Hierarchy窗口新建一个命名为Sword的2D Object,并挂在Player对象下面
  • 上面选个带颜色的小方框方便自己看
  • 勾选掉Sprite Renderer 使其在屏幕上不显示
  • 添加一个box Collider碰撞体,修改大小使其尽量贴合
    unity索敌,unity,unity,游戏引擎

5.2 武器动起来

  • 新建一个PlayerSword的脚本,并添加给Sword对象,脚本如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerSword : MonoBehaviour
{

    public int knockbackForce;//攻击力度
    private void OnCollisionEnter2D(Collision2D collision)
    {
       // Debug.Log("OnCollisionEnter2D inter");
        Collider2D collider = collision.collider;
        if (collider != null && collider.tag == "animals")
        {
            //Debug.Log("animals inter");
            Vector3 vector3 = collision.transform.position - transform.position;
            collider.GetComponent<Rigidbody2D>().AddForce(vector3 * knockbackForce);

        }
    }
}

修改PlayerMovement中OnMove方法,当角色翻转武器也随着翻转

 private void OnMove(InputValue input)
    {
        inputMove = input.Get<Vector2>();
        if(inputMove == Vector2.zero)
        {
            anim.SetBool("isWalk", false);
        }
        else
        {
            anim.SetBool("isWalk", true);
            if (inputMove.x > 0)
            {
                sprite.flipX = true;//x轴运动大于0时,不进行翻转

            }
            if (inputMove.x < 0)
            {

                sprite.flipX = false;//沿x轴运动小于0时,进行翻转
               
            }
            if (sprite.flipX)
            {
                transform.GetChild(0).position = position;
            }
            else
            {
                transform.GetChild(0).position = new Vector3(-position.x, position.y, position.z);
            }



        }

设置参数
unity索敌,unity,unity,游戏引擎

此时武器接触到Eagle可以弹开Eagle一段距离

小结

屏幕中的像素大小好像有点问题文章来源地址https://www.toymoban.com/news/detail-861648.html

到了这里,关于Unity 2D RPG索敌攻击练习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity技能学院——RPG动作类游戏角色普攻的实现

    实现角色普攻是每个RPG类型动作游戏都会实现的功能,在游戏过程中,玩家与敌人相互攻击,产生攻击判定、血量减少、攻击效果等等。 这是几乎是我们每一个想上手RPG游戏开发的必修课。 因此本期内容讲各位零基础的学友带来最简单易上手的角色普攻教学。保证你一遍就

    2024年04月16日
    浏览(51)
  • 【UnityRPG游戏制作】Unity_RPG项目之界面面板分离和搭建

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :Unity基础实战 插件为Unity自带的UGUI各控件实现 StartPanel ——(开始面板创建) StartTipPanel ——(游戏说明面板创建) defeatPanel ——(失败界面面

    2024年04月24日
    浏览(58)
  • Unity 2D 新手练习整理 FrogJump 上

    第一个Unity demo 记录一下,一个2D休闲过关小游戏 跟着这个up主操作的 https://www.bilibili.com/video/BV1k64y1N7MV/?spm_id_from=333.337.search-card.all.clickvd_source=c861e132f3eaa49aa9a51955095f5a4e 相关软件版本 Tuanjie Editor 1.0.4 1.1 Unity商店找使用的资源 https://assetstore.unity.com/zh-CN 1.2 下载的资源包括 图片

    2024年04月09日
    浏览(37)
  • Unity中敌人简单逻辑的实现(来回走动,攻击)2D

    unity自带一套自动巡航系统,但是目前应该先了解最基本的使用代码控制敌人实现逻辑(1来回走动,2发现玩家时追着玩家,3进入敌人攻击范围时进行攻击),一般来说这是最基本的敌人的功能 分析完敌人所具备的能力后,就将敌人的能力进行拆解,分别进行实现 一 来回走

    2024年02月12日
    浏览(43)
  • unity 2d游戏开发教程(2d战棋)

    unity 2d 游戏开发教程(2d战棋) 类似的游戏有:火焰纹章,梦幻模拟战 素材下载地址: 人物 https://brullov.itch.io/generic-char-asset 场景 https://anokolisa.itch.io/sidescroller-pixelart-sprites-asset-pack-forest-16x16 场景2:https://anokolisa.itch.io/dungeon-crawler-pixel-art-asset-pack/devlog/447513/12th-road-map-for-pi

    2024年02月13日
    浏览(51)
  • UNITY—2D游戏制作入门!

    Unity作为当今最流行的游戏引擎之一,受到各大厂商的喜爱。 像是炉石传说,以及逃离塔克夫,都是由unity引擎开发制作。 作为初学者的我们,虽然无法直接做出完成度那么高的作品,但每一个伟大的目标,都有一个微不足道的开始。让我们从一个2D小游戏入手,来学习Unit

    2024年02月04日
    浏览(52)
  • Unity——2D小游戏笔记整理

    【每日一句:清晨和夜晚都请用尽全力去生活】 目录 一、环境搭建 二、人物 三、相机跟随人物移动 四、平铺精灵 五、血条跟随敌人行走 六、脚本逻辑 【玩家行走方法】 【玩家跳跃方法】 【改变玩家血量值方法】 【创建玩家子弹方法】 【主角血量,改变血条遮罩】 【敌

    2024年02月09日
    浏览(52)
  • Unity之创建第一个2D游戏项目

    一 Unity环境配置 1.1 Untity资源官网下载:https://unity.cn/releases 1.2 Unity Hub集成环境,包含工具和项目的管理 1.3 Unity Editor编辑器 1.4 Visual Studio 2022脚本编辑器 1.5 AndroidSKD,JDK,NDK工具,用于android环境的运行 二 创建Unity项目 2.1 新建2D模板项目 2.2 新建2D物体 2.3 新建C#脚本文件 

    2024年02月04日
    浏览(47)
  • unity-2D游戏地面检测 三射线检测

        2D游戏中跳跃是不可或缺的功能,要实现跳跃功能,就必须进行地面检测!常规方法是使用一根往角色下方延伸的射线检测,但是这种方法在一些复杂不规则的地面效果通常不尽人意。通过增加射线数量,即可完善这种方法的不足,达到在复杂地面也能正确检测角色是否

    2024年02月15日
    浏览(37)
  • Unity:2D游戏设置相机orthographicSize动态设置

    目录 根据设备分辨率动态设置相机 orthographicSize 2d游戏里面相机的Orthan.size确定的是高度,宽度是按照屏幕的宽高比计算出来的 cameraWidthSize = camera.Orthographic.size*(Screen.Width/Screen.height) 我在游戏里设置的 开发分辨率是1080*1920 所以我在原先Y=1920情况下 Camera设置的orthographicSize=

    2024年01月25日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包