需要帮助来理解这部分代码是如何工作的



我在Unity2d中制作平台生成器。所以会有一些平台可以跳上,也可以跳下。我尝试了不同的方法来检查下面的平台。我找到了这个密码。它能很好地检测你身下是否有任何东西,但我无法理解其中的这一部分。对象";玩家";具有特殊触发器,用于检测下面的层。此触发器适用于此代码。当某个东西进入触发器时,它会检测到它所在的层。如果该层在触发器中是正确的,它就会返回true。当它退出触发器时,返回false。

以下是我不理解的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class scr_GroundCheck: MonoBehaviour
{
[SerializeField] private LayerMask groundLayerMask;
[SerializeField] private platformLayerMask;
public bool isGrounded;
private void OnTriggerStay2D(Collider2D collision)
{
// This is what I don't understand.
isGrounded = collision != null && (((1 << collision.gameObject.layer) & groundLayerMask) != 0);
}
}

我不明白这条线到底是怎么工作的。

我认为这一行的这一部分令人困惑:

((1<<collision.gameObject.layer(&groundLayerMask(

你可以试着在";位字段";,谷歌的第一个热门话题是:https://en.wikipedia.org/wiki/Bit_field

这里发生的事情是";groundLayerMask";它的名字意味着,一个二进制掩码,它指定零、一或32个可能掩码的任何组合(因为枚举通常源自32位的int(,而";collision.gameObject.layer";是一个整数,仅指一个可能的单层/位。

所以"1<lt;collision.gameObject.layer";从位置(0,1,2,…(转换为单个位(1,2,4,8

0 -> 0000 0001 = 1
1 -> 0000 0010 = 2
2 -> 0000 0100 = 4
3 -> 0000 1000 = 8

等等

所以";(1<<collision.gameObject.layer(&groundLayerMask(";如果groundLayerMask不包含collision.gameObject.layer引用的层,则为零,如果包含,则为非零。

最新更新