参考视频教程:https://www.bilibili.com/video/BV1rX4y1j7kN/?spm_id_from=333.788
1、添加玩家方块,为刚体添加碰撞器
添加组件RigidBody 2D以及BoxCollider 2D
勾选RigidBody中的z轴冻结旋转
检查碰撞体大小
2、创造地形
使用unity自带的瓦片地图
2D Object - Tilemap - Rectangular
Window - 2D - Tile Palette -Create New Palette命名为Ground
Ground相当于一个图层,可以在该图层上将二维网格上的瓦片(图像片段)组合成更大图像或场景。
将瓦片图片素材拖入
调整每单位像素树和图片大小一致即可保证一个图片占一个格子
给地形添加碰撞器
添加TileMap Collider 2D,勾选由复合使用
添加Composite Collider 2D
自动添加的RigidBody下将身体类型改成静态的,以防重力影响
测试
能够正常停留在地面上,调整碰撞体体积减小缝隙
掉下去有回弹,调整物体RigidBody碰撞检测为持续,休眠模式为从不,插值为插值
为玩家添加碰撞脚本
添加PlayerMove脚本,挂载在Player上
SerializeField中文意思是序列化域;
序列化 (Serialization)意思是将对象的状态信息,转换为可以存储或传输的形式。
序列化之后,数据就可以保存了。
就可以作为monoBehaviour子类的属性类型,public出来,写入场景文件,也就是.unity文件。
否则就会报错,告诉你没有序列化,不知道如何保存数据。
input.GetAxis()与input.GetAxisRaw()两个函数的传入值都为string类型,返回值都为float类型
传入参数有两种:
Vertical:获得垂直方向的值。
Horizontal:获得水平方向的值。
input.GetAxis()的返回值是[-1, 1],拥有平滑过渡功能
input.GetAxisRaw()的返回值是{-1,0,1}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class move : MonoBehaviour
{
//玩家刚体
private Rigidbody2D rb;
//玩家速度变量
[SerializeField] float playerSpeed;
//玩家移动方向
private float horizontal;
// Start is called before the first frame update
void Start()
{
//获取刚体
rb = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
//获取玩家输入的值
horizontal = Input.GetAxisRaw("Horizontal");
}
private void FixedUpdate()
{
Move();
}
private void Move()
{
//设置速度
rb.velocity = new Vector2(horizontal * playerSpeed, rb.velocity.y);
}
}
制作翻转效果
改变scale值
private bool facingRight = true;
...
private void Move()
{
//设置速度
rb.velocity = new Vector2(horizontal * playerSpeed, rb.velocity.y);
//设置翻转
if ((facingRight && horizontal < 0)|| (!facingRight && horizontal > 0))
{
facingRight = !facingRight;
transform.localScale = new Vector3(transform.localScale.x * -1, 1, 1);
}
}
添加冲刺功能
- 给人物添加拖尾渲染器组件Trail Renderer
调整属性和持续时间
设置透明度
设置材质
取消emitting,编写程序生成
//冲刺效果变量
[SerializeField] TrailRenderer tr;
//玩家移动方向
private float horizontal;
private bool facingRight = true;
//能否冲刺
private bool canDash;
//是否冲刺
private bool isDashing;
//冲刺力道
private float dashingPower = 24f;
//冲刺时间
private float dashingTime = 0.4f;
//冷却时间
private float dashingCoolDown = 0.2f;
...
void Update()
{
//获取玩家输入的值
//冲刺时禁止跳跃加速
if(isDashing)
{
return;
}
horizontal = Input.GetAxisRaw("Horizontal");
if(Input.GetKeyDown(KeyCode.LeftShift))
{
StartCoroutine(dash());
}
}
private void FixedUpdate()
{
if (isDashing)
{
return;
}
Move();
}
private IEnumerator dash()
{
//第一阶段,开始冲刺
canDash = false;
isDashing = true;
//去掉重力影响
float originalScale = rb.gravityScale;
rb.gravityScale = 0f;
rb.velocity = new Vector2(horizontal * dashingPower, 0f);
tr.emitting = true;
//第二阶段,停止冲刺
yield return new WaitForSeconds(dashingTime);
isDashing = false;
rb.gravityScale = originalScale;
tr.emitting = false;
//第三阶段,冲刺冷却
yield return new WaitForSeconds(dashingCoolDown);
canDash = true;
}
添加光照和阴影
- 下载光照资源
Window - Package Manager - Unity注册表 - Universal RP - 创建2D渲染器
Assets - Create - Rendering - URP Asset(with 2D Renderer) - 更改项目属性
- 添加全局光
Light - GlobalLight - 更改物体和地面材质为Sprite-Lit
- 更改为点光源Spot并改变合适位置,勾选阴影强度
- 添加阴影
添加组件Shadow Caster - (可选)消除墙壁摩擦力
Asset - Create - 2D -Physical Material
拖动至人物RigidBody 2D - Materiel - 消除阴影锯齿
调整URP_Renderer和URP中的渲染缩放