HOME
BLOG
Unity 2D部分
9月 08 2022

2D介绍

一般 2D / 3D 是指游戏内容部分,绝大多数 UI 本身是 2D。

主要学习内容:

  1. 2D素材和渲染

  2. 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("我一直在火圈里面");
        }
    }
}


👾森木清树👾

Unity Study