写一个工具类能够让所有的建筑物体检测地面并且吸附地面

直接上代码

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);
        
    }
}

效果图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Unity引擎中,吸附跟随(Adhesive Follow)通常是指让游戏中的一个对象(比如角色A)始终保持与另一个对象(比如玩家角色B)之间一定的贴合度,并随其移动。这通常用于创建物理上连接的游戏元素,例如角色的抓取、吸附或者吸附于特定表面的行为。 实现吸附跟随,你可以使用Unity内置的一些组件和脚本功能,例如Rigidbody(刚体)、CharacterController(角色控制器)或者Transform(变换)。以下是简单的步骤: 1. 给跟随者(角色A)添加Rigidbody并启用Gravity Scale属性,以便它能受到引力影响。 2. 创建一个物体作为吸附目标(角色B),并为其设置Collider。 3. 编一个脚本来控制跟随者的行为,例如当跟随者的边缘接近目标时,调整跟随者的速度和方向,使其紧贴目标。 4. 使用OnMove回调函数或FixedUpdate更新跟随者的位移,确保实时响应目标的位置变化。 下面是一个简化的伪代码示例: ```csharp public class AdhesiveFollow : MonoBehaviour { public Transform target; // 目标对象 private float distanceThreshold; private Vector3 lastPosition; void FixedUpdate() { // 获取当前距离 Vector3 currentDistance = transform.position - target.position; // 如果距离小于阈值,计算并应用吸附力 if (currentDistance.magnitude < distanceThreshold) { Vector3 force = target.position - lastPosition; rigidbody.AddForce(force); } // 记录上次位置 lastPosition = transform.position; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值