2D介绍
一般 2D / 3D 是指游戏内容部分,绝大多数 UI 本身是 2D。
主要学习内容:
2D素材和渲染
2D物理系统
Sprite
& SpriteRenderer
| 2D 游戏相机
Projection –》 Orthographic
| Sprite
& SpriteSheet
Sprite
:一种游戏资源,在2D游戏中表示角色、场景的图片资源
SpriteSheet
:切割一个图片为多个 Sprite
就是 SpriteSheet
| SpriteRenderer
一个用来显示 Sprite
的组件
Sprite
:表示当前显示的Sprite
Color
:给Sprite
叠加的颜色Filp
:翻转SortingLayer
:排序层OrderinLayer
:排序值
演示:
public class L3_2Demo : MonoBehaviour
{
private SpriteRenderer SpriteRenderer;
public Sprite Sprite;
void Start()
{
SpriteRenderer = GetComponent<SpriteRenderer>();
SpriteRenderer.sprite = Sprite;
SpriteRenderer.color = Color.black;
SpriteRenderer.flipX = true;
}
}
2D物理系统:刚体
| 物理系统
物理现象模拟,如重力
常用组件主要由 刚体 和 碰撞体 组成
| 2D 刚体
一个游戏如果希望具备重力,那么他一定需要有 RigidBody(刚体)组件。
BodyType:
Dynamic:动态,最仿真的
Kinematic:运动,由代码控制
Static:静态,不是为了移动而设计的
Simulated:是否模拟,不模拟的话,不会有重力、碰撞等
Mass:质量
Linear Drag:位置移动的阻力系数
Angular Drag:旋转移动的阻力系数
Gravity Scale:重力程度
Collision Detection:定义如何检测 2D 碰撞体之间的碰撞
Constraints:定义对 2D 刚体运动的任何限制
| 物理材质
Frictionn:摩擦力
Bounciness:弹性
演示:
public class L3_3Demo : MonoBehaviour
{
private Rigidbody2D rigidbody_2D;
void Start()
{
rigidbody_2D = GetComponent<Rigidbody2D>();
//rigidbody_2D.mass = 3;
rigidbody_2D.gravityScale = 0.5f;
}
void Update()
{
// 坐标
//rigidbody_2D.MovePosition(transform.position + new Vector3(0, 1, 0)*Time.deltaTime);
// 改变力 - 赛车刹车
//rigidbody_2D.velocity = new Vector2(0, 1);
// 施加力
//rigidbody_2D.AddForce(Vector2.up*10);
}
}
2D物理系统:碰撞体
| 概念
游戏中一个游戏物体物理边缘,用来防止穿模、检测碰撞
| 组件
点击Edit Collider,可以在scene 面板中编辑碰撞体尺寸
Offset:偏移量
Size:碰撞体尺寸
Material:物理材质
| 碰撞事件
很多时候,我们需要知道两个游戏物体发生碰撞,比如子弹碰到了玩家角色,玩家需要扣除相应的 HP
OnCollisionEnter2D
:碰撞进入
OnCollisionExit2D
:碰撞退出
OnCollisionStay2D
:碰撞过程中
Collision2D
:碰撞信息
gameObject
:对方的游戏物体
public class L3_4Demo : MonoBehaviour
{
// -------重要知识-------
// 1.双方都没有碰撞体和刚体,是绝对不可能触发碰撞事件(函数)(×)
// 2.双方都有碰撞体和刚体 (√)
// 3.一方有刚体和碰撞体,另外一方只有碰撞体【无论是哪一方,双方都可以进入碰撞事件】 (√)
// 4.双方都没有刚体,无法进入 (×)
// --------------------
// 碰撞进入
private void OnCollisionEnter2D(Collision2D collision)
{
//print("碰撞进入"+"我碰到的是"+collision.gameObject.name);
if(collision.gameObject.tag == "Bullet")
{
print("我掉血了,我被击中了");
GameObject.Destroy(collision.gameObject);
}
}
// 碰撞退出
private void OnCollisionExit2D(Collision2D collision)
{
print("碰撞退出");
}
// 碰撞中
private void OnCollisionStay2D(Collision2D collision)
{
print("碰撞中");
}
}
2D物理系统:触发
| 触发概念
如赛车到达终点,用来作为胜利或计时的依据;或者传送门,进入后可以传送,但并不需要真的和玩家发生碰撞
| 设置触发
在碰撞体上勾选 IsTrigger
即可
设置后这个游戏物体并不具备”物理边缘“,任何游戏物体都可以穿过
| 触发事件
OnTriggerEnter2D
:触发进入
OnTriggerExit2D
:触发退出
OnTriggerStay2D
:触发过程中
Collision2D
:对方碰撞体
演示:
public class L3_5Demo : MonoBehaviour
{
// -------重要知识-------
// 类似碰撞
// 1.双方都没有碰撞体和刚体,是绝对不可能触发触发事件(函数)(×)
// 2.双方都有碰撞体和刚体 (√)
// 3.一方有刚体和碰撞体,另外一方只有碰撞体【无论是哪一方,双方都可以进入触发事件】 (√)
// 4.双方都没有刚体,无法进入 (×)
// --------------------
// 触发进入
private void OnTriggerEnter2D(Collider2D collision)
{
print("触发进入");
if(collision.gameObject.name == "Player")
{
print("我被击中了,我掉血了");
//GameObject.Destroy(collision.gameObject);
}
}
// 触发退出
private void OnTriggerExit2D(Collider2D collision)
{
print("触发退出");
}
// 触发中
private void OnTriggerStay2D(Collider2D collision)
{
print("触发中");
if (collision.gameObject.name == "火圈")
{
print("我一直在火圈里面");
}
}
}