c# - Physics.OverlapSphere 未正确检测对撞机
问题描述
我正在 Unity 中为大学作业做一个人工智能“迷你游戏”。我正在尝试使用转向使简单的代理在可行走的网格内移动。现在我正在使用植绒转向,我正在使用本文中显示的方法。
我遇到的问题是 OverlapSphere 函数没有正确返回对撞机,如图所示:
这是我用于转向的代码。Overlap Sphere 调用中的 8 是用于此转向的碰撞器所在的层。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SteeringFlocking : SteeringAbstract
{
Move move;
public uint detection_radius = 5;
// Start is called before the first frame update
void Start()
{
move = GetComponent<Move>();
}
// Update is called once per frame
void Update()
{
Collider[] agents_near = Physics.OverlapSphere(transform.position, detection_radius, 8);
if (agents_near.Length > 0)
{
Vector3 final = Alignment(agents_near) + Cohesion(agents_near) + Separation(agents_near);
move.AccelerateMovement(final.normalized * move.max_mov_acceleration, priority);
}
}
private Vector3 Alignment(Collider[] agents_near)
{
Vector3 result = Vector3.zero;
for (uint i = 0; i < agents_near.Length; ++i)
{
result += agents_near[i].gameObject.GetComponent<Move>().movement;
}
result.x /= agents_near.Length;
result.y /= agents_near.Length;
result.z /= agents_near.Length;
result.Normalize();
return result;
}
private Vector3 Cohesion(Collider[] agents_near)
{
Vector3 result = Vector3.zero;
for (uint i = 0; i < agents_near.Length; ++i)
{
result += agents_near[i].gameObject.transform.position;
}
result.x /= agents_near.Length;
result.y /= agents_near.Length;
result.z /= agents_near.Length;
result = new Vector3(result.x - move.transform.position.x, result.y - move.transform.position.y, result.z - move.transform.position.z);
result.Normalize();
return result;
}
private Vector3 Separation(Collider[] agents_near)
{
Vector3 result = Vector3.zero;
for (uint i = 0; i < agents_near.Length; ++i)
{
result += agents_near[i].gameObject.transform.position - move.transform.position;
}
result.x /= agents_near.Length;
result.y /= agents_near.Length;
result.z /= agents_near.Length;
result *= -1;
result.Normalize();
return result;
}
private void OnDrawGizmos()
{
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, detection_radius);
}
}
预期的结果是 OverlapSphere 正确返回了其中的碰撞器数量。
解决方案
Overlap Sphere 调用中的 8 是用于此转向的碰撞器所在的层。
8
和第 8 层的位掩码不是一回事。
8
只是8
。#8 层的位掩码等于1<<8
或 256。
此外,您的角色似乎不是不在第 8 层,而是在第 0 层,所以您的 OverlapSphere 当然会返回零对撞机(除非孩子们在不同的层上,屏幕截图并没有说明清楚)。
你会想要这个:
Collider[] agents_near = Physics.OverlapSphere(transform.position, detection_radius, 1<<8);
除了将您的对象更改为实际位于第 8 层(尽管我会选择不同的对象,因为 Unity 具有硬编码的第 8 层名称,因为Post Processing
它没有您想要的上下文值)。
或者
Collider[] agents_near = Physics.OverlapSphere(transform.position, detection_radius, 1<<0); //cast against layer 0.
请参阅:图层。
推荐阅读
- algorithm - 无向图的最小加权路径树
- javafx - Java FXML应用程序:从外部类的控制器类中调用方法不成功
- java - Spring Boot 两路 SSL 实现
- java - AccessibilityService ~ AccessibilityNodeInfo 单击时:保持闪烁
- python - 按日期时间路径组件对 url 列表进行排序
- uml - 哪个类图是正确的:有继承还是没有继承?
- jquery - 运行滑块功能时计算局部值
- python - 如何使用子进程实时获取运行命令的输出?
- r - 将估计值和 p 值放入数据框中
- ember.js - 如何查看 Ember FastBoot 完成的请求?