直接上代码
using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
using System.IO;
using OHGame;
using Unity.VisualScripting;
public class OHEditorTool : Editor
{
[MenuItem("OHGame/Tools/行动区域点落地")]
private static void GetObjectsWithScript()
{
// 在编辑器模式下获取所有SpawnExitGizmos脚本的物体
SpawnExitGizmos[] objectsWithScript = GameObject.FindObjectsOfType<SpawnExitGizmos>();
foreach (SpawnExitGizmos obj in objectsWithScript)
{
if (obj.IsGround)
{
obj.AddComponent<EditorModeUpdate>();
}
Debug.Log("Object with SpawnExitGizmos script: " + obj.gameObject.name);
}
}
}
using OHGame;
using UnityEditor;
using UnityEngine;
[ExecuteInEditMode]
public class EditorModeUpdate : MonoBehaviour
{
[SerializeField] private LayerMask groundLayer = 1;
private void Update()
{
// 在编辑器模式下执行的代码
SnapObjectToGround();
}
private void SnapObjectToGround()
{
// 从物体下方发射射线,检测地面碰撞
RaycastHit hit;
transform.position += new Vector3(0, 1, 0);
if (Physics.Raycast(new Ray(transform.position , Vector3.down * 20f), out hit, Mathf.Infinity, groundLayer))
{
// 将物体位置设置为地面位置
transform.position = hit.point+new Vector3(0,GetComponent<SpawnExitGizmos>().Cube_Size.y/2f,0);
//Destroy(transform.GetComponent<EditorModeUpdate>());
GameObject.DestroyImmediate(this);
}
}
void OnDrawGizmos()
{
Gizmos.color = Color.red;
Gizmos.DrawRay(transform.position , Vector3.down * 20f);
}
}
效果图