IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity学习笔记--实现UI元素跟随3D物体 -> 正文阅读

[游戏开发]Unity学习笔记--实现UI元素跟随3D物体

前言

首先要分摄像机的渲染模式

  1. Camera的渲染模式为ScreenSpaceOverlay
  2. Camera的渲染模式为ScreenSpaceCamera

一、Camera的渲染模式为ScreenSpaceOverlay

思路

首先理解ScreenSpaceOverlay渲染模式

ScreenSpaceOverlay—这个模式不再需要UI摄像机,UI将出现在游戏场景的前面。但是这样会出现问题,如果要在UI前面放置一个游戏对象,那么这个对象将不可见。

那么我们就把目标的世界坐标转换为屏幕坐标,之后再赋值给UI物体的RectTransform的position就可以了。

二、Camera的渲染模式为ScreenSpaceCamera

思路

首先理解ScreenSpaceCamera渲染模式

ScreenSpaceCamera—这种模式需要提供一个UICamera 。这样就和NGUI的原理很像了,如果我想在UI前面加特效我可以在创建一个摄像机深度大于这个UICamera就行了。

这里我们需要用到Unity自带的工具类RectTransformUtility里面的

public static bool ScreenPointToLocalPointInRectangle
	(
		RectTransform rect, 
		Vector2 screenPoint,
		Camera cam, 
		out Vector2 localPoint
	);

不知道作用的我贴一下官方文档:官方文档

那么我们只需要得到需要跟踪物体的屏幕坐标就行了。
那么我们首先得到它。

Vector2 pos = m_camera.WorldToScreenPoint(m_target.transform.position);

之后我们可以获得RectTransformUtility.ScreenPointToLocalPointInRectangle函数out出来的值。把它赋值给UI物体的坐标就行了。

两种情况合并代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UIFollowWorldObject : MonoBehaviour
{
    private Camera m_camera;
    private Transform m_target;
    private Canvas m_canvas;

    private bool hasFollowed = false;
    public bool alwaysFollow = true;
    public void Init(Camera camera, Transform target, Canvas canvas)
    {
        m_camera = camera;
        m_target = target;
        m_canvas = canvas;
        FollowObject();
    }

    public void Update()
    {
        FollowObject();
    }

    private void FollowObject()
    {
        if (!alwaysFollow && hasFollowed)
        {
        	return;
        }

        if (m_camera != null && m_target != null)
        {
            Vector2 pos = m_camera.WorldToScreenPoint(m_target.transform.position);
            switch (m_canvas.renderMode)
            {
                case RenderMode.ScreenSpaceOverlay:
                    (transform as RectTransform).position = pos;
                    hasFollowed = true;
                    break;
                case RenderMode.ScreenSpaceCamera:
                    if (RectTransformUtility.ScreenPointToLocalPointInRectangle(transform.parent as RectTransform, pos, m_camera, out Vector2 point))
                    {
                        transform.localPosition = new Vector3(point.x, point.y, 0);
                        hasFollowed = true;
                    }
                    break;
            }
        }
    }
}

使用方法

我们需要首先把该脚本挂载到UI物体上。之后需要调用的时候就调用该UI脚本的Init函数就可以了。

例如:

GameObject.FindObjectOfType<UIFollowWorldObject>().
	Init(
			Camera.main, transform, 
			GameObject.FindObjectOfType<Canvas>()
		);
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-11-30 15:56:52  更:2021-11-30 15:57:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 7:48:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码