前言
欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第26篇中,我们将探索如何用unity制作一个unity2d横版卷轴动作类游戏,我会附带项目源码,以便你更好理解它。
本节主要是控制人物移动跳跃
新输入系统 New Input System
新增Player Input组件,点击创建新的输入系统,生成之后就可以删除Player Input组件了
会自动给我们创建好一些必备输入参数,比如移动
代码调用,点击自动生成代码
新增PlayerController ,代码调用
public class PlayerController : MonoBehaviour { public PlayerInputControl inputControl; public Vector2 inputDirection; public float speed; private Rigidbody2D rb; private void Awake() { // 初始化输入控制 inputControl = new PlayerInputControl(); rb = GetComponent<Rigidbody2D>(); } private void OnEnable() { // 启用输入控制 inputControl.Enable(); } private void OnDisable() { // 禁用输入控制 inputControl.Disable(); } private void Update() { // 获取输入方向 inputDirection = inputControl.Player.Move.ReadValue<Vector2>(); } private void FixedUpdate() { Move(); } //移动角色 private void Move() { // 根据输入方向移动角色 rb.velocity = new Vector2(inputDirection.x * speed * Time.deltaTime, rb.velocity.y); // 根据输入方向翻转角色 if (inputDirection.x < 0) { transform.localScale = new Vector3(-Mathf.Abs(transform.localScale.x), transform.localScale.y, transform.localScale.z); } else if (inputDirection.x > 0) { transform.localScale = new Vector3(Mathf.Abs(transform.localScale.x), transform.localScale.y, transform.localScale.z); } } }
配置
效果(忽略动画,因为这个我是后录的)
跳跃
键盘
手柄,如果有的话
修改PlayerController
using UnityEngine.InputSystem; public float jumpForce; private void Awake() { // 初始化输入控制 inputControl = new PlayerInputControl(); rb = GetComponent<Rigidbody2D>(); inputControl.Player.Jump.started += Jump; } //跳跃 private void Jump(InputAction.CallbackContext context){ rb.AddForce(transform.up * jumpForce, ForceMode2D.Impulse); }
效果(忽略动画,因为这个我是后录的)
地面检测,禁止无限跳跃
想要更加精准的地面检测,可以看我这篇文章:【unity技巧】Physics2D Raycast、Overlapcircle、OverlapBox检测的用法
新增PhysicsCheck ,做地面地面检测
public class PhysicsCheck : MonoBehaviour { public Vector2 bottomOffset;// 检测圆形底部偏移量 public float checkRadius; // 圆形检测半径 public LayerMask groundLayer; // 地面图层 public bool isGround; // 是否在地面上 private void Update() { Check(); } public void Check() { // 检测是否在地面上 isGround = Physics2D.OverlapCircle(transform.position, checkRadius, groundLayer); } private void OnDrawGizmosSelected() { // 在 Scene 视图中绘制检测范围 Gizmos.DrawWireSphere((Vector2)transform.position + bottomOffset, checkRadius); } }
修改PlayerController
private PhysicsCheck physicsCheck; physicsCheck = GetComponent<PhysicsCheck>(); //跳跃 private void Jump(InputAction.CallbackContext context){ if(physicsCheck.isGround) rb.AddForce(transform.up * jumpForce, ForceMode2D.Impulse); }
配置
效果(忽略动画,因为这个我是后录的)
取消摩檫力
默认碰撞体之间是存在摩檫力的,当人物跳跃到墙体时,可能出现卡墙的情况
新建2d的物理材质
摩檫力设置为0
配置
效果(忽略动画,因为这个我是后录的)
源码
源码不出意外的话我会放在最后一节