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资源
在这里插入图片描述

2 地图地形创建

2.1 创建项目

新建2D核心模版的项目
在这里插入图片描述

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

Windows-Package Manager窗口,将保存好的资源下载并导入
在这里插入图片描述

2.3 添加地形

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

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中,即可进行绘制
    在这里插入图片描述

  • 将Palette窗口中的树和房子分别拖动到创建的图层上,调整位置大小
    在这里插入图片描述

2.5 添加组件

  • 给house和plant添加组件,组合碰撞器Composite Collider;Rigidbody2D组件中的Body type设置为静止static;添加Tilemap Collider组件勾选used By Composite
    在这里插入图片描述

2.6 设置围墙补充些建筑

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

3 角色移动动画脚本

补充资源

导入Dungeon中sprites下human的图片资源
在这里插入图片描述

3.1 创建人物

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

  • Inspector窗口选择标签tag为player

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

  • 翻转Flip选中 x轴

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

  • 调整到合适的位置和大小
    在这里插入图片描述

  • 补充 上面Layer所在图层也创建并选择为player
    在这里插入图片描述

3.2 Player组件添加及设置

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

  • 添加碰撞体组件Box Collider2D,调整碰撞体大小
    在这里插入图片描述

  • 在package Manager窗口中搜索input System组件进行下载安装,安装过程中会进行重启一下
    在这里插入图片描述

  • 给Player添加input System组件,点击创建创建,里面是一些默认的用户输入的对应获取,使用时可以通过OnMove、OnFire等方法获取用户输入的信息
    在这里插入图片描述

3.3 Player的相关动画

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

在这里插入图片描述

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
在这里插入图片描述

3.5 镜头追随

  • Windows-package Manager中找到Cinematic Studio 点击安装
    在这里插入图片描述
  • 安装后在Hierarchy窗口,创建一个cinematic-2DCamera
  • 在Follow处选择Player,如果执行镜头太小,调整lens Size的值
    在这里插入图片描述

3.6 Player效果总结

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

4 加个小怪兽

4.1 创建小怪兽

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

4.2 添加组件

  • 添加Collider碰撞体组件
  • 创建一个图层animal,并将eagel选中到新创建的图层
  • 添加Rigidbody2D组件,重力为0,锁定z轴
    在这里插入图片描述

4.3 创建动画

  • 资源中有eagle的三个动画,选中拖到asset下创建的Animation文件夹下的eagle文件夹中,将动画拖动给eagle对象
  • 调整动画控制器的条件,去掉过渡时间,存在时间等,加入条件isDive、isIdle、isHurt
    在这里插入图片描述

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对象,并设置速度力度等相关参数
在这里插入图片描述

4.5 存为预制体

在Assets文件夹下创建prefab文件夹,将Eagle对象从Hierarchy窗口拖至文件夹下,存为预制体,需要时直接拖动至屏幕中,所有设置不变
在这里插入图片描述

4.6 Eagle效果总结

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

5 我削小怪兽

5.1 加个武器

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

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);
            }



        }

设置参数
在这里插入图片描述

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

小结

屏幕中的像素大小好像有点问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值