unity中實現選中人物腳下顯示圓形標識且完美貼合復雜地形(如彈坑) 的效果

? ? ? ? 要實現人物腳下圓形?完美貼合復雜地形(如彈坑)?的效果,核心思路是?「動態生成貼合地面的 Mesh」?—— 即根據地面的高度場實時計算環形頂點的 Y 坐標,讓每個頂點都 “貼” 在地面上。

核心邏輯:
  1. 確定環形范圍:以人物腳部為中心,設定半徑(如 1 米)和分段數(如 36 段,決定平滑度)。
  2. 生成環形頂點:在 XY 平面生成環形的頂點坐標(極坐標轉笛卡爾坐標),然后?對每個頂點,實時獲取其在地面的 Y 高度
  3. 構建 / 更新 Mesh:將頂點組成環形 Mesh(三角面或線框),每幀或人物移動時,重新計算頂點的 Y 坐標,確保貼合地面。
關鍵步驟實現:

? ? ? ?1.?地面高度采樣(核心!)

  • 對 Unity Terrain:用?Terrain.SampleHeight(xzPosition)?直接獲取地形高度。
  • 對 Mesh 地面:發射射線檢測地面,獲取?RaycastHit.point.y(更通用,支持任意模型地面)。
  • float GetGroundY(float x, float z) {Vector3 origin = new Vector3(x, characterFoot.position.y + 10f, z); // 從高處向下射Ray ray = new Ray(origin, Vector3.down);if (Physics.Raycast(ray, out RaycastHit hit, 20f, groundLayers)) {return hit.point.y; // 地面高度}return characterFoot.position.y; //  fallback
    }

    2.?動態生成環形 Mesh

  • 頂點生成:以中心為原點,用極坐標生成環形頂點的 X、Z 坐標,再通過上述方法獲取 Y 坐標。
  • 三角面構建:將頂點組成三角面(填充環形)或線框(僅邊緣)。
  • 實時更新:人物移動或地面變化時,重新計算頂點的 Y 坐標,更新 Mesh。
  • 示例代碼(簡化版,生成填充環形):
  • using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;using UnityEngine;public class tmp : MonoBehaviour
    {public Transform characterFoot;public float radius = 1f;public int segments = 36;public LayerMask groundLayers;private Mesh mesh;private Vector3[] vertices;private int[] triangles;private MeshFilter meshFilter;private MeshRenderer meshRenderer;void Start(){// 獲取或添加MeshFilter組件meshFilter = GetComponent<MeshFilter>();if (meshFilter == null)meshFilter = gameObject.AddComponent<MeshFilter>();// 獲取或添加MeshRenderer組件(用于顯示網格)meshRenderer = GetComponent<MeshRenderer>();if (meshRenderer == null)meshRenderer = gameObject.AddComponent<MeshRenderer>();mesh = new Mesh();meshFilter.mesh = mesh;meshRenderer.sharedMaterial = new Material(Shader.Find("Universal Render Pipeline/Unlit"));UpdateMesh();}void UpdateMesh(){if (meshFilter == null || characterFoot == null) return;vertices = new Vector3[segments + 1];vertices[0] =new  Vector3(0, GetGroundY(0f, 0f) - characterFoot.position.y + 0.03f, 0);//vertices[0] = characterFoot.position;for (int i = 1; i <= segments; i++){float angle = Mathf.Deg2Rad * (i * 360f / segments);//float x = characterFoot.position.x + Mathf.Cos(angle) * radius;//float z = characterFoot.position.z + Mathf.Sin(angle) * radius;float x = Mathf.Cos(angle) * radius;float z =  Mathf.Sin(angle) * radius;float y = GetGroundY(x, z) - characterFoot.position.y+0.03f;vertices[i] = new Vector3(x, y, z);}triangles = new int[segments * 3];for (int i = 0; i < segments; i++){triangles[i * 3] = 0;      // 中心點triangles[i * 3 + 1] = i + 2;  // 下一個頂點triangles[i * 3 + 2] = i + 1;  // 當前頂點}triangles[segments * 3 - 2] = 1;   // 最后補上循環mesh.vertices = vertices;mesh.triangles = triangles;mesh.RecalculateNormals();Vector3[] normals = mesh.normals;mesh.normals = normals;}void Update(){if (meshFilter == null || vertices == null) return;//vertices[0] = new Vector3(0, GetGroundY(0f, 0f) - characterFoot.position.y + 0.03f, 0);for (int i = 0; i <= segments; i++){Vector3 pos = vertices[i];pos.y =  GetGroundY(pos.x, pos.z)- characterFoot.position.y + 0.03f;Debug.Log(pos.y);vertices[i] = pos;}mesh.vertices = vertices;mesh.RecalculateNormals();}float GetGroundY(float x, float z){if (characterFoot == null) return 0;// 3D射線起點:在角色腳下位置上方10單位處Vector3 origin = new Vector3(characterFoot.position.x+x, characterFoot.position.y + 10f, characterFoot.position.z+z);// 射線方向和長度Vector3 direction = Vector3.down;float maxDistance = 20f;// 繪制射線(僅在編輯模式和Play模式的Scene視圖可見)// 顏色設為紅色,持續0.1秒(足夠看清且不會殘留太久)Debug.DrawRay(origin, direction * maxDistance, Color.red, 0.1f);// 3D射線檢測RaycastHit hit;if (Physics.Raycast(origin, direction, out hit, maxDistance, groundLayers)){// 繪制碰撞點標記(綠色小球)Debug.DrawRay(hit.point, Vector3.up * 0.5f, Color.green, 0.1f);return hit.point.y;}// 未檢測到地面時,繪制射線終點標記(黃色小球)Debug.DrawRay(origin + direction * maxDistance, Vector3.up * 0.5f, Color.yellow, 0.1f);return characterFoot.position.y;}}

    3.?視覺優化(Shader + 紋理)

  • 紋理:使用帶 Alpha 通道的環形紋理(中間透明,邊緣黃色漸變)。
  • Shader:采用?Transparent?shader,支持 Alpha 混合,可添加?自發光(Emission)?效果讓環形更醒目。
  • 動畫:通過 Shader 或代碼實現邊緣閃爍、顏色漸變(如選中時高亮)。

方案優勢 vs 其他方法

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92459.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92459.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92459.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

引領GameFi 2.0新范式:D.Plan攜手頂級財經媒體啟動“龍珠創意秀”

在GameFi賽道尋求新突破的今天&#xff0c;一個名為Dragonverse Plan&#xff08;D.Plan&#xff09;的項目正以其獨特的經濟模型和宏大愿景&#xff0c;吸引著整個Web3社區的目光。據悉&#xff0c;D.Plan即將聯合中文區頂級加密媒體金色財經與非小號&#xff08;Feixiaohao&a…

通信算法之307:fpga之時序圖繪制

時序圖繪制軟件 一. 序言 在FPGA設計過程中&#xff0c;經常需要編寫設計文檔&#xff0c;其中&#xff0c;不可缺少的就是波形圖的繪制&#xff0c;可以直接截取Vivado或者Modelsim平臺實際仿真波形&#xff0c;但是往往由于信號雜亂無法凸顯重點。因此&#xff0c;通過相應軟…

計網學習筆記第3章 數據鏈路層(灰灰題庫)

題目 11 單選題 下列說法正確的是______。 A. 路由器具有路由選擇功能&#xff0c;交換機沒有路由選擇功能 B. 三層交換機具有路由選擇功能&#xff0c;二層交換機沒有路由選擇功能 C. 三層交換機適合異構網絡&#xff0c;二層交換機不適合異構網絡 D. 路由器適合異構網絡&…

SQL的LEFT JOIN優化

原sql&#xff0c;一個base表a,LEFT JOIN三個表抽數 SELECT ccu.*, ctr.*, om.*, of.* FROM ods.a ccu LEFT JOIN ods.b ctr ON ccu.coupon_code ctr.coupon_code AND ctr.is_deleted 0 LEFT JOIN ods.c om ON ctr.bill_code om.order_id AND om.deleted 0 LEFT JOIN ods.…

Redis 核心概念、命令詳解與應用實踐:從基礎到分布式集成

目錄 1. 認識 Redis 2. Redis 特性 2.1 操作內存 2.2 速度快 2.3 豐富的功能 2.4 簡單穩定 2.5 客戶端語言多 2.6 持久化 2.7 主從復制 2.8 高可用 和 分布式 2.9 單線程架構 2.9.1 引出單線程模型 2.9.2 單線程快的原因 2.10 Redis 和 MySQL 的特性對比 2.11 R…

【Day 18】Linux-DNS解析

目錄 一、DNS概念 1、概念和作用 2、域名解析類型 3、 軟件與服務 4、DNS核心概念 區域 記錄 5、查詢類型 6、分層結構 二、DNS操作 配置本機為DNS內網解析服務器 &#xff08;1&#xff09;修改主配置文件 &#xff08;2&#xff09;添加區域 正向解析區域&#xff1a; …

Python 中 OpenCV (cv2) 安裝與使用介紹

Python 中 OpenCV (cv2) 安裝與使用詳細指南 OpenCV (Open Source Computer Vision Library) 是計算機視覺領域最流行的庫之一。Python 通過 cv2 模塊提供 OpenCV 的接口。 一、安裝 OpenCV 方法 1&#xff1a;基礎安裝&#xff08;推薦&#xff09; # 安裝核心包&#xff0…

微軟WSUS替代方案

微軟WSUS事件回顧2025年7月10日&#xff0c;微軟最新確認Windows Server Update Services&#xff08;WSUS&#xff09;出現了問題&#xff0c;導致IT管理員無法正常同步和部署Windows更新。WSUS是允許管理員根據策略配置&#xff0c;將更新推送到特定計算機&#xff0c;并優化…

Minio 分布式集群安裝配置

目錄創建 mkdir -p /opt/minio/run && mkdir -p /etc/minio && mkdir -p /indata/disk_0/minio/datarun&#xff1a;啟動腳本及二進制文件目錄/etc/minio&#xff1a;配置文件目錄data&#xff1a;數據存儲目錄下載 minio wget https://dl.min.io/server/minio…

Spring Boot + ShardingSphere 實現分庫分表 + 讀寫分離實戰

&#x1f680; Spring Boot ShardingSphere 實現分庫分表 讀寫分離&#xff08;涵蓋99%真實場景&#xff09; &#x1f3f7;? 標簽&#xff1a;ShardingSphere、分庫分表、讀寫分離、MySQL 主從、Spring Boot 實戰 分庫分表 vs 讀寫分離 vs 主從配置與數據庫高可用架構區別 …

將普通用戶添加到 Docker 用戶組

這樣可以避免每次使用 Docker 命令時都需要 sudo。以下是具體步驟&#xff1a;1. 創建 Docker 用戶組&#xff08;如果尚未存在&#xff09; 默認情況下&#xff0c;安裝 Docker 時會自動創建 docker 用戶組。可以通過以下命令檢查&#xff1a; groupadd docker&#xff08;如果…

Scrapy(一):輕松爬取圖片網站內容?

目錄 一、CrawlSpider 簡介? 二、實戰案例&#xff1a;圖片網站爬取? 三、代碼解析&#xff1a;核心組件詳解? 類定義&#xff1a; 2.核心屬性&#xff1a;? 3.爬取規則&#xff08;Rules&#xff09;&#xff1a;? 4.數據提取方法&#xff08;parse_item&#xff09;…

使用 systemd 的原生功能來實現 Redis 的自動監控和重啟,而不是依賴額外的腳本最佳實踐方案

使用 systemd 的原生功能來實現 Redis 的自動監控和重啟&#xff0c;而不是依賴額外的腳本最佳實踐方案方案 1&#xff1a;配置 systemd 服務文件&#xff08;推薦&#xff09;1. 檢查/創建 Redis 的 systemd 服務文件2. 配置關鍵參數&#xff08;覆蓋配置示例&#xff09;3. 重…

Eclipse 代碼模板

Eclipse 代碼模板 引言 Eclipse 作為一款功能強大的集成開發環境&#xff08;IDE&#xff09;&#xff0c;深受廣大開發者的喜愛。在編程過程中&#xff0c;使用代碼模板可以大大提高開發效率&#xff0c;減少重復勞動。本文將詳細介紹 Eclipse 代碼模板的配置、使用方法以及一…

輸電線路防外破聲光預警裝置 | 防山火/防釣魚/防施工安全警示系統

在輸電網絡的安全保障中&#xff0c;外力破壞是一個不容忽視的問題&#xff0c;各類隱患可能對電力系統造成嚴重影響。TLKS-PMG-WP 輸電線路聲光防外破警示裝置在應對這類挑戰時&#xff0c;有著獨特的技術表現&#xff0c;下面從功能和技術參數兩方面進行詳細介紹。核心功能解…

STM32——STM32CubeMX

總&#xff1a;STM32——學習總綱 一、簡介 注意&#xff0c;非邏輯代碼。 可兼容不同系列的STM32Cube固件包。 STM32Cube前置知識鏈接&#xff1a; STM32——HAL庫 不可過多依賴&#xff0c;此工具只針對STM32芯片&#xff0c;類似英飛凌芯片無法配置。主要用于參考。 二、安…

Java NIO 核心原理與秋招高頻面試題解析

一、NIO 概述Java NIO&#xff08;New I/O 或 Non-blocking I/O&#xff09;是 Java 1.4 引入的一套全新 I/O API&#xff0c;位于 java.nio 包下。NIO 提供了與傳統 BIO&#xff08;Blocking I/O&#xff09;完全不同的 I/O 處理方式&#xff0c;通過非阻塞模式、緩沖區&#…

vue3+element-plus,el-popover實現篩選彈窗的方法

實現一個篩選框&#xff0c;點擊篩選按鈕出現彈窗&#xff0c;彈窗內有選擇框/輸入框/單選框等等&#xff0c;底部有重置/確定兩個按鈕。需求&#xff1a;點擊篩選外部其他位置可以關閉彈窗&#xff0c;關閉彈窗后已編輯的數據不保存&#xff0c;點擊確定按鈕關閉彈窗&#xff…

python每日一題 貪心算法練習

在一條環路上有 n 個加油站&#xff0c;其中第 i 個加油站有汽油 gas[i] 升。你有一輛油箱容量無限的的汽車&#xff0c;從第 i 個加油站開往第 i1 個加油站需要消耗汽油 cost[i] 升。你從其中的一個加油站出發&#xff0c;開始時油箱為空。給定兩個整數數組 gas 和 cost &…

Python + Pika RabbitMQ集群壓測完整方案

一、最近搭建了個rabbitmq集群 三個磁盤節點&#xff0c;上生產環境之前想做個壓測&#xff0c;測試下穩定性&#xff0c;參考Deepseek做了如下測試方案二、核心代碼實現&#xff1a; 配置文件 (config.py) import os RABBITMQ_NODES [amqp://admin:123456192.168.0.175:8101,…