unity3d - OverlapBoxAll 2d 没有检测到任何东西
问题描述
这个脚本应该检测到与 Hurtbox 层的碰撞器的碰撞(使用 OverlapBoxAll)但它不起作用我已经配置好矩阵层并且在检查器中分配了变量,所以我不知道我的错误是什么。pd:碰撞发生在 HitboxUpdate 方法我的碰撞层矩阵 2d:
https://answers.unity.com/storage/temp/173342-sin-titulo.png
场景和层次:
https://answers.unity.com/storage/temp/173344-scene.png
剧本:
public string owner = "-1";
public Vector3 boxSize;
public Vector3 position;
public Quaternion rotation;
public LayerMask mask;
public bool useSphere = false;
public float radius = 0.5f;
public Color inactiveColor;
public Color collisionOpenColor;
public Color collidingColor;
private ColliderState _state;
// ignoreList = ds_List_create()
public float hitStun = 60;
private IHitboxResponder _responder = null;
// Update is called once per frame
void Update()
{
HitboxUpdate();
}
public void StartCheckingCollision()
{
_state = ColliderState.Open;
}
public void StopCheckingCollision()
{
_state = ColliderState.Closed;
}
void OnDrawGizmos()
{
// Draw a yellow sphere at the transform's position
Debug.Log("draw hitbox gizmos");
CheckGizmoColor();
Gizmos.matrix = Matrix4x4.TRS(transform.position, transform.rotation, transform.localScale);
if (useSphere)
{
Gizmos.DrawSphere(Vector3.zero, radius); }
else
{
Gizmos.DrawCube(position, new Vector3(boxSize.x * 2, boxSize.y * 2, boxSize.z * 2));
}
}
private void CheckGizmoColor()
{
switch (_state)
{
case ColliderState.Closed:
Gizmos.color = inactiveColor;
Debug.Log("Closed");
break;
case ColliderState.Open:
Gizmos.color = collisionOpenColor;
Debug.Log("Open");
break;
case ColliderState.Colliding:
Gizmos.color = collidingColor;
Debug.Log("colliding");
break;
}
}
public void HitboxUpdate()
{
StartCheckingCollision();
if (_state == ColliderState.Closed)
{
Debug.Log("Collider cloded");
return;
}
Debug.Log("Collider open hit");
Collider2D[] colliders = Physics2D.OverlapBoxAll(position, boxSize, transform.eulerAngles.z ,mask);
if (colliders.Length > 0)
{
_state = ColliderState.Colliding;
Debug.Log("We hit something hitbox");
}
if (colliders.Length > 0)
{
for (int i = 0; i < colliders.Length; i++)
{
if (colliders[i].gameObject.GetComponent<Hurtbox>() != null)
{
if (colliders[i].gameObject.GetComponent<Hurtbox>().owner == owner)
{
Debug.Log("collider skiped");
colliders = colliders.Skip(i).ToArray();
}
}
Debug.Log("Hit " + colliders[i].gameObject.name);
}
}
for (int i = 0; i < colliders.Length; i++)
{
Collider2D aCollider = colliders[i];
Debug.Log("Works");
_responder?.CollisionedWith(aCollider);
}
_state = colliders.Length > 0 ? ColliderState.Colliding : ColliderState.Open;
}
public void UseResponder(IHitboxResponder responder)
{
_responder = responder;
}
} 公共枚举 ColliderState {
Closed,
Open,
Colliding
}
解决方案
改变
Collider2D[] colliders = Physics2D.OverlapBoxAll(position, boxSize, transform.eulerAngles.z ,mask);
至
Collider2D[] colliders = Physics2D.OverlapBoxAll(position, boxSize ,mask);
推荐阅读
- c++ - 无法从 C++ 中的 SQLAPI++ 程序连接到我的 Oracle 数据库
- php - 望远镜安装在 laravel-7.25 上失败
- php - 在 PHP 中使用它自己的属性重命名对象键
- python - StringIO 的路径太长,但不是文本
- javascript - 运行我的 react 应用程序的生产版本时,res.data 返回 html 而不是令牌
- laravel - 当表单提交在 Laravel 中失败时如何保留输入字段中的值
- php - 从 Base64 解码添加文件时出现错误“指定文件上传测试失败”
- exceljs - 如何使用 exceljs 定义范围的名称?
- tensorflow - tf.dataSync() 不会以可读形式从 BlazeFaceModel 返回张量
- reactjs - 将函数传递给自定义钩子