概要
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一段距离文章来源:https://www.toymoban.com/news/detail-861648.html
小结
屏幕中的像素大小好像有点问题
文章来源地址https://www.toymoban.com/news/detail-861648.html
到了这里,关于Unity 2D RPG索敌攻击练习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!