unity3D 自定义公告牌
前言
有时候我们希望公告牌跟随镜头旋转永远平行面向屏幕,同时跟随镜头缩放缩放大小不变(镜头远离物体,正常物体视觉效果变小,但公告牌视觉大小比例不变),或者跟随镜头缩放变化,本文记录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 自定义公告牌的更多相关文章
- 内网公告牌获取天气信息解决方案(C# WebForm)
需求:内网公告牌能够正确显示未来三天的天气信息 本文关键字:C#/WebForm/Web定时任务/Ajax跨域 规划: 1.天定时读取百度接口获取天气信息并存储至Txt文档: 2.示牌开启时请求Web ...
- 关于Unity3D自定义编辑器的学习
被人物编辑器折腾了一个月,最终还是交了点成品上去(还要很多优化都还么做). 刚接手这项工作时觉得没概念,没想法,不知道.后来就去看<<Unity5.X从入门到精通>>中有关于 ...
- Unity3D自定义地形的笔刷,刷出别样地形
是不是很简单呀,大家可以发挥想象刷出特殊的地形,小鸡呀,或者其他的logo之类(顶视图看上去效果很棒)的地形. 最后把我找的笔刷上传,Gizmos 注意: 如果文件夹及图片导入后,地形系统的笔刷无 ...
- Unity3D自定义资源配置文件
http://blog.csdn.net/candycat1992/article/details/52181814 写在前面 我竟然最近两天才知道Unity中ScriptableObject的存在… ...
- Unity3D自定义编辑器简单实例
MenuItem:在标题栏自定义菜单.需要在Editor文件夹内创建脚本,无需挂载.但是注意其下的函数必须为静态函数. using UnityEngine; using UnityEditor; pu ...
- unity3d 自定义载入条/载入动画
在 Assets 下新建文件夹 WebGLTemplates , 在 WebGLTemplates 文件夹下新建文件夹 MyTemplate, 新建index. 在 PlayerSetting 中的 ...
- Unity3D 自定义事件(事件侦听与事件触发)
先来看下效果图,图中点击 Cube(EventDispatcher),Sphere(EventListener)以及 Capsule(EventListener)会做出相应的变化,例子中的对象相互之间 ...
- Unity3d自定义脚本模板
这是一个小技巧,打开Unity安装目录,如: C:\Program Files (x86)\Unity\Editor\Data\Resources\ScriptTemplates /* * * Tit ...
- Unity3D Demo项目开发记录
前言 经过一段时间的学习与实际开发,unity3D也勉强算是强行入门了,正所谓好记性不如烂笔头,更何况本人并非专业从事unity3D开发,会一点C#但也并不熟悉,为了避免后期遗忘,因此特意整理了一个D ...
随机推荐
- cocos2d-x 特效集合
本文转载自:http://www.cnblogs.com/linux-ios/archive/2013/04/09/3009292.html bool HelloWorld::init() { /// ...
- python 空值(NoneType)
- qt开发ROS遇到这个问题 find_package(catkin) failed. catkin was neither found in the workspace nor in the CMAKE_PREFIX_PATH...
为了实现用Qt开发ROS界面开发环境,我几乎参阅了网上所有的配置教程,安装了多个版本的qt,在ubuntu14.04和ubuntu16.04上分别进行了配置,最后都成功了.不得不说的是用QTCREAT ...
- @atcoder - AGC038F@ Two Permutations
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 与两个 0~N-1 的置换 P, Q. 现在你需要找到 ...
- redhat6.5安装oracle11_2R
参照前人一步一步操作: http://leihenzhimu.blog.51cto.com/3217508/1685164 遇到如下错误: This is a prerequisite conditi ...
- Oracle基础学习4--Oracle权限传递
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/wang379275614/article/details/32215325 以下将用一个实例来解说: ...
- 模板—树上倍增LCA
int LCA(int x,int y) { if(x==y)return x; if(dep[x]>dep[y])swap(x,y); while(dep[x]<dep[y]) ;;i+ ...
- hdu 3873 Invade the Mars(有限制的最短路 spfa+容器)
Invade the Mars Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 365768/165536 K (Java/Others ...
- @codechef - SERSUM@ Series Sum
目录 @description@ @solution@ @part - 1@ @part - 2@ @part - 3@ @accepted code@ @details@ @description@ ...
- PHPstorm相关设置以及快捷键
转自:http://blog.csdn.net/fenglailea/article/details/12166617 1.界面中文方框问题 Settings->Appearance中Theme ...