オブジェクトが完全にコライダーの中に入っているかどうか?を判定するためのコードを組みました。
BoxColliderの各面をPlaneとして取得するスクリプト
と
Vector3操作スクリプト(ランダム方向、要素の最大値を取得)
はこの処理をするためのものです
ColliderFullyInsideCheck.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ColliderFullyInsideCheck: MonoBehaviour
{
private Material material;
private Color DefaultColor;
private Color ChangeColor = Color.green;
public SphereCollider TargetCollider;
void Awake()
{
material = GetComponent<MeshRenderer>().material;
DefaultColor = material.GetColor("_Color");
}
public bool isColorChange
{
set
{
material.SetColor("_Color", value ? ChangeColor : DefaultColor);
}
}
public bool isColliderFullyInside(BoxCollider box, SphereCollider sphere)
{
float radius = Calc.MaxElementOfVector3(sphere.transform.lossyScale) * sphere.radius;
Vector3 center = sphere.transform.TransformPoint(sphere.center);
int inside_count = 0;
Plane[] planes = Calc.GetBoxColliderPlanes(box);
for (int i = 0; i < 6; i++)
{
float inside_distance = planes[i].GetDistanceToPoint(center);
if (-inside_distance >= radius)
{
inside_count++;
}
}
return inside_count == 6;
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
isColorChange = isColliderFullyInside(GetComponent<BoxCollider>(), TargetCollider);
}
}