Unity2D游戏里碰撞盒Collider2D中的Layer Overrides

 有关Layer Overrides

Layer Override Priority(图层覆盖优先级): 这个选项决定当有多个碰撞层级重写时,哪个重写将优先生效。它可以让你设置复杂的碰撞关系,例如当一个物体属于多个碰撞层级时。

Include Layers(包含层): 这里可以选择哪些额外的图层应该在判断Collider2D是否与其他Collider2D接触时被考虑在内。这允许你指定哪些图层的物体可以与当前的Collider2D发生碰撞。

Exclude Layers(排除层): 这里可以选择在判断Collider2D是否与其他Collider2D接触时应该排除的额外图层。这允许你明确指出哪些图层的物体不应当与当前的Collider2D发生碰撞。

Force Send Layers(强制发送层): 这里可以选择在Collider2D之间发生碰撞时,当前Collider2D可以向哪些图层的物体发送力。当物体之间碰撞并且需要施加物理影响时,可以使用这个选项。

Force Receive Layers(强制接收层): 这里可以选择在Collider2D之间发生碰撞时,当前Collider2D可以从哪些图层的物体接收力。这与Force Send Layers相对,决定了当前物体可以受到哪些图层的物体的影响。

Contract Capture Layers(收缩捕获层): 此选项允许你选择哪些图层将在Collider2D收缩时捕获另一个Collider2D。通常这用于触发器事件,当物体的Collider2D变小并可能脱离与其他物体的接触时。

Callback Layers(回调层): 在这里,你可以选择在Collider2D与其他Collider2D接触时,哪些图层将触发回调事件,例如报告碰撞或触发器事件。(就是OnTriggerEnter那些之类的函数)

收缩捕获层:

比如一个球正在与另一个碰撞器接触, 当这个球进行收缩的时候,它会和球脱离接触, 如果我在球的这个碰撞器中重写了这个捕获层,就是有指定那个碰撞器的收缩捕获层,他(球)仍然会保持与该碰撞器的

”接触“和触发

正常情况下一般是通过移动改变位置来进入和脱离(接触)状态

 示例:

让父节点上挂载碰撞器,子节点上挂载触发器

 攀爬代码

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

public class ClimbLadder : MonoBehaviour
{
    private float vertical; // 垂直输入
    private float speed = 3f; // 爬梯子的速度
    private bool isLadder;
    private bool isClimbing;

    private Animator anim;

    [SerializeField] private Rigidbody2D rb;

    // Start is called before the first frame update
    void Start()
    {
        anim = this.GetComponent<Animator>();
        isClimbing = false;  // 初始时不处于攀爬状态
    }

    // Update is called once per frame
    void Update()
    {
        vertical = Input.GetAxis("Vertical");

        if (isLadder && Input.GetKey(KeyCode.W) && Mathf.Abs(vertical) > 0)
        {
            isClimbing = true;
            anim.SetBool("Climbing", true);
        }
    }

    private void FixedUpdate()
    {
        if (isClimbing)
        {
            rb.gravityScale = 0f;
            rb.velocity = new Vector2(rb.velocity.x, vertical * speed);
        }
        else
        {
            rb.gravityScale = 1f;
        }
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Ladder"))
        {
            isLadder = true;
           
        }
    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.CompareTag("Ladder"))
        {
            isLadder = false;
            isClimbing = false;
            anim.SetBool("Climbing", false);
            // 播放 Idle 动画
            anim.Play("Idle");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/2402_83809362/article/details/143267741