当前位置: 首页 > news >正文

Unity 技术文档:3D 第一人称任务指示器

📌 功能概述

该脚本用于在 Unity 3D 第一人称视角 中实现任务指示器功能。
当目标在摄像机视野内时,指示器会显示在屏幕对应位置;当目标在视野外时,指示器会移动到屏幕边缘并旋转箭头指向目标方向。


🛠️ 使用说明

  • KeyButton:UI 图像,用作指示器(通常是箭头或按钮图标)。
  • target:需要跟踪的目标对象。
  • mainCamera:场景中的主摄像机。
  • indicator:UI 元素的 RectTransform,用于定位和旋转。

📄 完整代码

using UnityEngine;
using UnityEngine.UI;public class InteractiveIndicator : MonoBehaviour
{public Image KeyButton;public Transform target;Camera mainCamera => Camera.main;RectTransform indicator => KeyButton.rectTransform;static Rect rect = new Rect(0, 0, 1, 1);private void Update(){if (target == null || mainCamera == null){return;}Vector3 targetViewportPos = mainCamera.WorldToViewportPoint(target.position);//如果目标在摄像机的视野内if(targetViewportPos.z>0&&rect.Contains(targetViewportPos)){indicator.anchoredPosition=new Vector2((targetViewportPos.x-0.5f)*Screen.width,(targetViewportPos.y-0.5f)*Screen.height);indicator.rotation = Quaternion.identity;}else{Vector3 screenCenter = new Vector3(Screen.width, Screen.height, 0) / 2;Vector3 targetScreenPos = mainCamera.WorldToScreenPoint(target.position);//确保目标在摄像机前方if(targetScreenPos.z<0){targetScreenPos *= -1;}Vector3 directionFromCenter = (targetScreenPos - screenCenter).normalized;//计算与屏幕边缘的交点float x = screenCenter.x / Mathf.Abs(directionFromCenter.y);float y = screenCenter.x / Mathf.Abs(directionFromCenter.x);float d = Mathf.Min(x, y);Vector3 edgePosition = screenCenter + directionFromCenter * d;//将z坐标设置为0以保持在UI层edgePosition.z = 0;indicator.position = edgePosition;//计算角度float angle = Mathf.Atan2(directionFromCenter.y, directionFromCenter.x) * Mathf.Rad2Deg;//旋转箭头以指向目标indicator.rotation = Quaternion.Euler(0, 0, angle + 90);}}
}

📊 工作流程

  1. 检测目标是否在摄像机视野内

    • 使用 WorldToViewportPoint 判断目标是否在 rect 范围内。
    • 若在视野内,则将 UI 指示器定位到屏幕对应位置。
  2. 目标在视野外时

    • 计算目标与屏幕中心的方向向量。
    • 将指示器移动到屏幕边缘交点。
    • 旋转指示器箭头,使其指向目标方向。

链接:【游戏中追踪目标指向箭头怎么做?一个脚本解决2D3D游戏屏幕贴边指向目标的UI指示标记,Unity中快速实现】https://www.bilibili.com/video/BV1uKBXYPE7w?vd_source=256a31ec907fa4985a200f42dceb1035

http://www.jsqmd.com/news/313363/

相关文章:

  • AI核心知识70——大语言模型之Context Engineering(简洁且通俗易懂版)
  • 二分:山脉数组的峰顶索引、寻找峰值、寻找旋转排序数组中的最小值、点名 - 实践
  • NetApp数据平台助力Super Bowl LX实现高效数据运营
  • 2026合同管理系统厂商哪家专业?行业深度解析
  • 用AI写小说真能签约:亲测6款好用AI写小说工具(成败经验分享)
  • Thinkphp和Laravel学生宿舍分配报修管理系统_o4dvi
  • Thinkphp和Laravel学生宿舍寝室管理系统的设计与开发_fyaa5
  • Thinkphp和Laravel学生档案管理系统_8xpgg
  • 什么是产品方案?产品方案解决什么问题?产品方案有什么收益?产品方案的价值是什么?
  • Thinkphp和Laravel小区物业报修管理系统_78ahx
  • Thinkphp和Laravel小程序“共享书角”图书借还管理系统
  • 读完Google这份Agent白皮书,我才理解了什么是Agent
  • 环境隔离:破解自动化测试CI失败率的终极武器
  • 计算机毕业设计项目源码/Flask+vue的博客系统设计与实现附开题报告,毕业论文,毕设代码
  • 计算机毕业设计源码/内蒙古旅游景点数据分析系统附开题报告,毕业论文
  • 2026合同管理软件哪家强?行业实力厂商解析
  • 1/28
  • 2026合同管理软件推荐:企业高效运营的智能助手
  • git分支命名规范
  • Mastercam许可效率优化分析
  • 2026无人机新规正式施行!各位飞手赶紧收藏
  • 2026年国内主流连锁型产后修复机构精选:标准化服务,品牌保障
  • 2026国内最新耐候胶公司top5推荐!高品质环保耐候胶实力厂家权威榜单发布,安全性能双优助力绿色建筑
  • 【IEEE出版 | EI检索】第九届先进电子技术、计算机与软件工程国际学术会议(AETCSE 2026)
  • 亲测好用MBA必备一键生成论文工具TOP8:开题报告文献综述全测评
  • 三明市英语雅思培训机构推荐;2026权威测评出国雅思辅导机构口碑榜单
  • 【Android毕设全套源码+文档】基于android的书院预约系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 站群服务器里的8C/4C/2C/1C有什么区别?选择哪个比较好?
  • TypeC转DP芯片方案,typec转dp支持8K双向转接芯片设计
  • 益生菌哪个牌子好?2026年度最建议买的十个益生菌品牌!安全可靠值得推荐