有关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");
}
}
}