前言

  有时候我们希望公告牌跟随镜头旋转永远平行面向屏幕,同时跟随镜头缩放缩放大小不变(镜头远离物体,正常物体视觉效果变小,但公告牌视觉大小比例不变),或者跟随镜头缩放变化,本文记录C#脚本的两种实现方式

  制作公告牌

  创建一个UI的Canvas,将Render Mode模式改成World Space,然后把Canvas画布拖进文件夹变成预制体

  添加Image背景图,再添加Text,Canvas画布、Text文字宽度、高度都设置为0,公告牌的大小由Image来设置

  再设置一下锚点等相关属性

    

  最后绑定上我们的控制脚本

  就这样,一个自定义公告牌就制作完成

  方式一

  如果镜头缩放镜头设置的是镜头的fieldOfView值

using UnityEngine;

/*
* 自定义公告牌,跟随镜头旋转永远平行面向屏幕,跟随镜头缩放缩放大小不变
*/
public class Billboard : MonoBehaviour { Camera camera;//主镜头 private float _fieldOfView;//初始fieldOfView void Start () {
camera = Camera.main; _fieldOfView = camera.fieldOfView;
} void Update ()
{
//跟随镜头旋转,直接把主镜头的旋转值赋值给公告牌即可
transform.rotation = camera.transform.rotation; //跟随镜头缩放(缩放镜头设置的是镜头的fieldOfView值)
float fieldOfView = camera.fieldOfView;
transform.localScale = new Vector3(fieldOfView/_fieldOfView,fieldOfView/_fieldOfView,fieldOfView/_fieldOfView);
} }

  方式二

  如果镜头缩放镜头设置的镜头的位置

using UnityEngine;

/*
* 自定义公告牌,跟随镜头旋转永远平行面向屏幕,跟随镜头缩放缩放大小不变
*/
public class Billboard : MonoBehaviour { Camera camera;//主镜头 private float _distance;//初始距离 void Start () {
camera = Camera.main; _distance = Vector3.Distance(camera.transform.position, transform.position);
} void Update ()
{
//跟随镜头旋转,直接把主镜头的旋转值赋值给公告牌即可
transform.rotation = camera.transform.rotation; //跟随镜头缩放(缩放镜头设置的镜头的位置),根据公告牌到主镜头的距离来做等距离缩放即可
float distance = Vector3.Distance(camera.transform.position, transform.position);//不断变化的距离
var scale = distance/_distance * 0.1F;
transform.localScale = new Vector3(scale,scale,scale);
} }

  脚本更新

  2020-05-15更新

  更新一下脚本,新增两个bool选项,跟随镜头旋转、跟随镜头放大,默认都是false,使用脚本时可按需配置

using UnityEngine;

/*
* 自定义公告牌,跟随镜头旋转永远平行面向屏幕,跟随镜头缩放缩放大小不变
*/
public class Billboard : MonoBehaviour { [Header("跟随镜头旋转")]
public bool isRotation = false; [Header("跟随镜头缩放")]
public bool isZoom = false; Camera camera;//主镜头 private float _distance;//初始距离,需要在程序运行时立即获取 private bool first = true; void Start () {
camera = Camera.main; //初始设置距离
_distance = Vector3.Distance(camera.transform.position, transform.position);
} void Update ()
{
//跟随镜头旋转,直接把主镜头的旋转值赋值给公告牌即可
if (isRotation)
{
transform.rotation = camera.transform.rotation;
} //跟随镜头缩放(缩放镜头设置的镜头的位置),根据公告牌到主镜头的距离来做等距离缩放即可
if (isZoom)
{
float distance = Vector3.Distance(camera.transform.position, transform.position);//不断变化的距离 var scale = distance / _distance * 0.1F;
transform.localScale = new Vector3(scale,scale,scale);
}
} }

  

  效果

  以下效果是不跟随缩放,如果想要跟随缩放,脚本代码注释缩放部分即可

  后记

  自定义公告牌暂时先记录到这,后续再进行补充

unity3D 自定义公告牌的更多相关文章

  1. 内网公告牌获取天气信息解决方案(C# WebForm)

    需求:内网公告牌能够正确显示未来三天的天气信息 本文关键字:C#/WebForm/Web定时任务/Ajax跨域 规划: 1.天定时读取百度接口获取天气信息并存储至Txt文档: 2.示牌开启时请求Web ...

  2. 关于Unity3D自定义编辑器的学习

    被人物编辑器折腾了一个月,最终还是交了点成品上去(还要很多优化都还么做).  刚接手这项工作时觉得没概念,没想法,不知道.后来就去看<<Unity5.X从入门到精通>>中有关于 ...

  3. Unity3D自定义地形的笔刷,刷出别样地形

    ​ 是不是很简单呀,大家可以发挥想象刷出特殊的地形,小鸡呀,或者其他的logo之类(顶视图看上去效果很棒)的地形. 最后把我找的笔刷上传,Gizmos 注意: 如果文件夹及图片导入后,地形系统的笔刷无 ...

  4. Unity3D自定义资源配置文件

    http://blog.csdn.net/candycat1992/article/details/52181814 写在前面 我竟然最近两天才知道Unity中ScriptableObject的存在… ...

  5. Unity3D自定义编辑器简单实例

    MenuItem:在标题栏自定义菜单.需要在Editor文件夹内创建脚本,无需挂载.但是注意其下的函数必须为静态函数. using UnityEngine; using UnityEditor; pu ...

  6. unity3d 自定义载入条/载入动画

    在 Assets 下新建文件夹 WebGLTemplates , 在 WebGLTemplates 文件夹下新建文件夹 MyTemplate, 新建index. 在 PlayerSetting 中的 ...

  7. Unity3D 自定义事件(事件侦听与事件触发)

    先来看下效果图,图中点击 Cube(EventDispatcher),Sphere(EventListener)以及 Capsule(EventListener)会做出相应的变化,例子中的对象相互之间 ...

  8. Unity3d自定义脚本模板

    这是一个小技巧,打开Unity安装目录,如: C:\Program Files (x86)\Unity\Editor\Data\Resources\ScriptTemplates /* * * Tit ...

  9. Unity3D Demo项目开发记录

    前言 经过一段时间的学习与实际开发,unity3D也勉强算是强行入门了,正所谓好记性不如烂笔头,更何况本人并非专业从事unity3D开发,会一点C#但也并不熟悉,为了避免后期遗忘,因此特意整理了一个D ...

随机推荐

  1. css的两栏布局

    经典的实现左边固定宽度,右边宽度自适应的几种方法 利用float和margin-left属性(margin-left的值可以稍稍大于或者等于.left的宽度) .left{ width: 30px; ...

  2. Django框架登录验证及产生随机验证码的实例

    1:views视图代码 # 登录验证 def login(request): # 使用ajax请求可以使用判断 # if request.is_ajax(): if request.method == ...

  3. oracle函数 lag()和lead()

    [语法] lag(EXPR,<OFFSET>,<DEFAULT>) LEAD(EXPR,<OFFSET>,<DEFAULT>) [功能]表示根据COL1 ...

  4. 【批量添加】-SqlBulkCopy语句 标签: sql批量添加 2015-12-20 14:39 1367人阅读 评论(33)

    上篇博客我们介绍了通过拼接sql字符串的方法来对sql数据库进行批量添加,但是通过语句拼接insert语句有个缺点,就是每次最多只能添加1000条.当时我们另外一个界面也用到了批量添加,但是这个界面轻 ...

  5. 17-2 orm单表操作和多表操作

    参考:https://www.cnblogs.com/liwenzhou/p/8660826.html 一  ORM单表操作 1 增删改查 1. 查询 1. 查所有 models.Publisher. ...

  6. ReactDOM & DOM Elements

    一.ReactDOM 1.1 render() ReactDOM.render(element,container,[callback]) 在container中渲染一个React元素,然后返回组件一 ...

  7. eclipse maven项目导出所使用的jar包

    在eclipse中定位到maven项目的pom.xml文件右击pom.xml文件,选择Run As-->Maven build…在打开的页面中,GOLAS栏输入“dependency:copy- ...

  8. Python--day38--事件

    1,事件的方法: #set和clear #分别用来修改一个事件的状态 True或者False#is_set用来查看一个事件的状态#wait 是依据事件的状态来决定自己是否阻塞# False最 True ...

  9. 2018-12-14-恢复-U-盘隐藏文件夹

    title author date CreateTime categories 恢复 U 盘隐藏文件夹 lindexi 2018-12-14 19:24:56 +0800 2018-12-14 19: ...

  10. PHP mysql扩展整理,操作数据库的实现过程分析

    相关文章:PHP mysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理   PHPmysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理 从某种程度上 ...