地图搭建

视频教程:​​https://learn.u3d.cn/tutorial/2d-mobile-mstudio#5fd1bf75266ffa00204d231c​

素材处理

找到地图素材:

Unity3D 开发一套2d游戏的记录_sed

Unity3D 开发一套2d游戏的记录_视频教程_02

对图片进行切割:

Unity3D 开发一套2d游戏的记录_视频教程_03

可以给每个图片新命名

Unity3D 开发一套2d游戏的记录_sed_04

瓦片

Unity3D 开发一套2d游戏的记录_视频教程_05

Unity3D 开发一套2d游戏的记录_图层_06

把资源拉进去

Unity3D 开发一套2d游戏的记录_2d_07

创建Background和Platform瓦片地图

Unity3D 开发一套2d游戏的记录_视频教程_08

Unity3D 开发一套2d游戏的记录_视频教程_09

调整摄像机的大小

Unity3D 开发一套2d游戏的记录_图层_10

图层

和IOS开发一样,可以设置不同的图层,进行先后的渲染,并且不同的图层间,还可以设置,是否可以碰撞。

Unity3D 开发一套2d游戏的记录_2d_11

这里可以拖动,改变图层的渲染先后

Unity3D 开发一套2d游戏的记录_视频教程_12

碰撞体

给地图添加碰撞体:

Unity3D 开发一套2d游戏的记录_图层_13

给游戏中的物体添加刚体和碰撞体

Unity3D 开发一套2d游戏的记录_2d_14

Unity3D 开发一套2d游戏的记录_视频教程_15

对于不规则的问题,可以调整碰撞体的形状

Unity3D 开发一套2d游戏的记录_图层_16

control+左键可以删除节点

如果希望有的图层之间不发生碰撞。修改参数

Unity3D 开发一套2d游戏的记录_视频教程_17

增加新的图层

Unity3D 开发一套2d游戏的记录_视频教程_18

预制体

Unity3D 开发一套2d游戏的记录_sed_19

Unity3D 开发一套2d游戏的记录_sed_20

创建一个复制体

Unity3D 开发一套2d游戏的记录_图层_21

主角

Unity3D 开发一套2d游戏的记录_ios开发_22

加排序图层 和 图层

Unity3D 开发一套2d游戏的记录_ios开发_23

Unity3D 开发一套2d游戏的记录_视频教程_24

加碰撞体

Unity3D 开发一套2d游戏的记录_sed_25

创建脚本

Unity3D 开发一套2d游戏的记录_视频教程_26

基本的移动

Unity3D 开发一套2d游戏的记录_图层_27

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

public class PalyerController : MonoBehaviour
{
private Rigidbody2D rd;
public float Speed; //左右移动速度
private bool JumpPressed;//是否跳跃
public float jumpForce; //跳跃的力
void Start()
{
rd = GetComponent<Rigidbody2D>();
}

void Update()
{
CheckInput();
}

private void FixedUpdate()
{
Movement();
Jump();
}

//检测按钮
void CheckInput()
{
if(Input.GetButtonDown("Jump"))
{
JumpPressed = true;
}
}

void Movement()
{
//float horizontalInput = Input.GetAxis("Horizontal");// -1 ~ 1小数
float horizontalInput = Input.GetAxisRaw("Horizontal");// -1 ~ 1 整数
if(horizontalInput != 0) //人物面向
{
transform.localScale = new Vector3(horizontalInput, 1, 1);
}

rd.velocity = new Vector2(horizontalInput * Speed, rd.velocity.y);
}

void Jump()
{
//是否跳跃
if (JumpPressed)
{
rd.velocity = new Vector2(rd.velocity.x, jumpForce);
JumpPressed = false;
}
}
}


Unity3D 开发一套2d游戏的记录_ios开发_28

卡墙问题

摩擦力设置为0

Unity3D 开发一套2d游戏的记录_ios开发_29

Unity3D 开发一套2d游戏的记录_sed_30

检测人物是否在地面, 防止连跳

Unity3D 开发一套2d游戏的记录_图层_31

地面的layer,如果碰撞到地面的layer可以跳跃。

创建检测的空物体

Unity3D 开发一套2d游戏的记录_图层_32

标签大小

Unity3D 开发一套2d游戏的记录_sed_33

代码添加

Unity3D 开发一套2d游戏的记录_视频教程_34

Unity3D 开发一套2d游戏的记录_图层_35

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

public class PalyerController : MonoBehaviour
{
private Rigidbody2D rd;
public float Speed; //左右移动速度
public float jumpForce; //跳跃的力

[Header("Ground Check")]
public Transform groundCheck; //检测物体的Transform
public float checkRadius; //检测范围
public LayerMask groundLayer; //和groundLayer发生检测

[Header("States Check")]
public bool canJump;//是否跳跃
public bool isGround; //是否在地面

void Start()
{
rd = GetComponent<Rigidbody2D>();
}

void Update()
{
CheckInput();
}

private void FixedUpdate()
{
PhysicsCheck();
Movement();
Jump();
}

//检测按钮
void CheckInput()
{
if(Input.GetButtonDown("Jump") && isGround) //按下jump 并且在地面
{
canJump = true;
}
}

//移动
void Movement()
{
//float horizontalInput = Input.GetAxis("Horizontal");// -1 ~ 1小数
float horizontalInput = Input.GetAxisRaw("Horizontal");// -1 ~ 1 整数
if(horizontalInput != 0) //人物面向
{
transform.localScale = new Vector3(horizontalInput, 1, 1);
}

rd.velocity = new Vector2(horizontalInput * Speed, rd.velocity.y);
}

//跳跃
void Jump()
{
//是否跳跃
if (canJump)
{
rd.velocity = new Vector2(rd.velocity.x, jumpForce);
canJump = false;
}
}

//检测是否在地面
void PhysicsCheck()
{
//有多种检测方法
//(检测的2d坐标 范围 检测碰撞的图层)
isGround = Physics2D.OverlapCircle(groundCheck.position, checkRadius, groundLayer);
}

}


Unity3D 开发一套2d游戏的记录_图层_36

查看检测范围

Unity3D 开发一套2d游戏的记录_视频教程_37

Unity3D 开发一套2d游戏的记录_图层_38

通过代码改变重力

Unity3D 开发一套2d游戏的记录_sed_39

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

public class PalyerController : MonoBehaviour
{
private Rigidbody2D rd;
public float Speed; //左右移动速度
public float jumpForce; //跳跃的力

[Header("Ground Check")]
public Transform groundCheck; //检测物体的Transform
public float checkRadius; //检测范围
public LayerMask groundLayer; //和groundLayer发生检测

[Header("States Check")]
public bool canJump;//是否跳跃
public bool isGround; //是否在地面

void Start()
{
rd = GetComponent<Rigidbody2D>();
}

void Update()
{
CheckInput();
}

private void FixedUpdate()
{
PhysicsCheck();
Movement();
Jump();
}

//检测按钮
void CheckInput()
{
if(Input.GetButtonDown("Jump") && isGround) //按下jump 并且在地面
{
canJump = true;
}
}

//移动
void Movement()
{
//float horizontalInput = Input.GetAxis("Horizontal");// -1 ~ 1小数
float horizontalInput = Input.GetAxisRaw("Horizontal");// -1 ~ 1 整数
if(horizontalInput != 0) //人物面向
{
transform.localScale = new Vector3(horizontalInput, 1, 1);
}

rd.velocity = new Vector2(horizontalInput * Speed, rd.velocity.y);
}

//跳跃
void Jump()
{
//是否跳跃
if (canJump)
{
rd.velocity = new Vector2(rd.velocity.x, jumpForce);
canJump = false;
}
}

//检测是否在地面
void PhysicsCheck()
{
//有多种检测方法
//(检测的2d坐标 范围 检测碰撞的图层)
isGround = Physics2D.OverlapCircle(groundCheck.position, checkRadius, groundLayer);
//是否在地面
if (isGround)
{
rd.gravityScale = 1; //重力大小
}
else
{
rd.gravityScale = 3; //重力大小
}
}

public void OnDrawGizmos()
{
//画圆 中心 半径
Gizmos.DrawWireSphere(groundCheck.position, checkRadius);
}

}