视频教程:https://learn.u3d.cn/tutorial/2d-mobile-mstudio#5fd1bf75266ffa00204d231c
素材处理
找到地图素材:
对图片进行切割:
可以给每个图片新命名
瓦片
把资源拉进去
创建Background和Platform瓦片地图
调整摄像机的大小
图层
和IOS开发一样,可以设置不同的图层,进行先后的渲染,并且不同的图层间,还可以设置,是否可以碰撞。
这里可以拖动,改变图层的渲染先后
碰撞体
给地图添加碰撞体:
给游戏中的物体添加刚体和碰撞体
对于不规则的问题,可以调整碰撞体的形状
control+左键可以删除节点
如果希望有的图层之间不发生碰撞。修改参数
增加新的图层
预制体
创建一个复制体
主角加排序图层 和 图层
加碰撞体
创建脚本
基本的移动
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;
}
}
}
卡墙问题
摩擦力设置为0
检测人物是否在地面, 防止连跳
地面的layer,如果碰撞到地面的layer可以跳跃。
创建检测的空物体
标签大小
代码添加
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);
}
}
查看检测范围
通过代码改变重力
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);
}
}