Unity3d C#实现三维场景中图标根据相机距离动态缩放功能

前言

如题的需求,其实可以通过使用UI替代场景中的图标来实现,不过这样UI的处理稍微麻烦,而且需要在图标上添加粒子特效使用SpriteRender更方便快捷。这里就根据相机离图标的位置来计算图标的缩放大小即可。这样基本保持了图标的大小,不会出现远小近大。从而避免了相机离得远图标点不中或者不好点击的问题。
默认效果:
在这里插入图片描述

动态缩放效果:
在这里插入图片描述

实现

这个功能的实现还有个功能,就是让图标永远面向相机,这个可以使用LookAT或者使用如下代码:

transform.forward = Camera.main.transform.forward;
transform.rotation = Camera.main.transform.rotation;

这个脚本需要主相机,不然会报错。

接下来就是编写缩放的脚本了(ScaleByCamDistance):

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

public class ScaleByCamDistance : MonoBehaviour
{
   
    [Header("距离缩放系数")]
    public float scaleFactor = 0.05f;
    [Header("最大缩放值")]
    public float MaxScale = 2;
    [Header("最小缩放值")]
    public float MinScale = .5f;


    [Header("缩放相机(默认为主相机)")]
    public Camera cam;

    float Dis;


    private void Awake()
    {
   
        if (cam == null)
            cam = Camera.main;

        if (cam == null)
            Debug.LogWarning("相机未赋值,主相机也未找到!");
    }

    private void FixedUpdate()
    {
   
        if (cam != null)
        {
   
            Dis = Vector3.Distance(transform.position, cam.transform.position) * scaleFactor;
            transform.localScale = Vector3.one * (Dis < MinScale ? MinScale : Dis > MaxScale ? MaxScale : Dis);
        }
    }

}

如上的脚本添加到对象上组件的Inspector会有如下配置界面:
在这里插入图片描述

其中距离缩放系数scaleFactor是距离的缩放系数,这个数值一般不用更改,除非你的场景比例差距有点大。
MaxScale、MinScale。最大缩放值、最小缩放值是用于缩放边界判定的,如果需要图标在不同距离都基本恒定大小,就需要把这两个的值设置到一个很大的区间。
cam是用于计算的相机,如果不赋值它默认是主相机,如果不赋值也没有主相机,那么这个功能是无效的。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-24 15:02:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-24 15:02:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-24 15:02:03       82 阅读
  4. Python语言-面向对象

    2024-01-24 15:02:03       91 阅读

热门阅读

  1. 进制转换(C++)(简易)(字符串)

    2024-01-24 15:02:03       50 阅读
  2. 旅游MR混合现实情景实训教学系统教学

    2024-01-24 15:02:03       57 阅读
  3. Redis的持久化!!!

    2024-01-24 15:02:03       54 阅读
  4. Relay Arm® 计算库集成

    2024-01-24 15:02:03       48 阅读
  5. 【Qt+SQLite使用】

    2024-01-24 15:02:03       66 阅读
  6. leetcode - 527. Word Abbreviation

    2024-01-24 15:02:03       50 阅读
  7. Spring/Spring boot项目接入traceId

    2024-01-24 15:02:03       45 阅读
  8. C Primer Plus(第六版)13.11 编程练习 第11题

    2024-01-24 15:02:03       48 阅读