需要源码和资源包请点赞关注收藏后评论区留言私信~~~

一、效果展示

效果展示如下 射线动态的在地球上发射和接收 整个场景也是一个的动态的过程,看上去充满科技感

演示视频如下

虚拟地球射线

二、实现步骤

打开Unity Hub选择新建下项目,选择3D模板,工程名为EarthRay

然后导入资源包 需要资源包请点赞关注收藏后评论区留言私信

1:制作虚拟地球

创建球体 在Hierarchy视图中右击,选择3D Object->Sphere命令 新建一个球体

然后将球体的position设置为0,0,0,设置摄像机的position属性为0,0,-1.5,这样地球就在屏幕正中间显示了

2:制作虚拟地球大气层

在Hierarchy视图中右击球体对象,选择新建一个球体,命名为Clouds

然后调整Clouds对象的Scale属性为1.01,1.01,1.01 使其比Earth对象大一点,笼罩在Earth对象外围

3:天空盒设置

天空有些单调 我们将天空盒设置为太空的场景 这样看起来更美观和具有科技感

打开window-rendering-lighting窗口 然后切换到environment选项卡 找到skybox material属性,然后将materials文件夹中的skybox文件拖入skybox material属性卡槽

至此 虚拟地球场景搭建完成

4:制作虚拟地球信息射线

首先我们要实现地球自转

在Scripts文件夹中新建一个C#脚本,命名为Earth  代码放在文章结尾

在实现虚拟地球信息射线前,需要先了解一下如何制作射线

因为地球的球面是一个弧形,从地球上的一点向另一点发射信息射线是一个弧线,所以不能直接将两个点链接到一起,需要弧度平滑,弧度平滑可以用贝塞尔曲线生成

5:实现单击后发射虚拟地球信息射线

接下来实现当单击地球上两个点后发射虚拟地球信息射线的功能

新建一个C#脚本,命名为Line 代码放在文章末尾

6:实现自动发射虚拟地球信息射线

自动发射虚拟地球信息射线需要先在球的表面选取两个点,用代码实现时要设计几何知识,已知球的求新坐标,要想在球的表面随机选取两个点,需要先在球心随机生成两个方向向量,这两个方向向量从球心出发,分别经过一个半径长度,即可到达球的表面,方向向量与球的表面的相交处就是要选取的点

7:波纹粒子特效

我们将用做好的粒子特效,直接导入即可

三、代码

导入资源包结构如下

代码文件夹结构如下

部分代码如下 需要全部代码请点赞关注收藏后评论区留言私信~~~

earth.cs

using System.Collections;
using Uni
public class Earth : MonoBehaviour
{public Line line;// 曲线private Vector3 pos1 = Vector3.zero;// 鼠标点击第一个点private Vector3 pos2 = V{line.gameObject.SetActive(false);}void Update(){// 地球自转transform.Rotate(Vector3.up * Time.deltaTime, Space.Self);// 点击发射虚拟地球信息射线RayClickLine();// 自动发射虚拟地球信息射线AutoFireLine();}/// <summarprivate void RayClickLine(){if (Input.GetMouseButtonDown(0)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit)){mouseClicks++;if (mouseClicks == 1){// 第一个点坐标pos1 = hit.point;}if (mouseClicks == 2){2 = hit.point;// 计算其他点的坐标Vector3[] pos;pos = CountPoints(pos1, pos2);Vector3 ctrlPoint1 = pos[0];Vector3 ctrlPoint2 = pos[1];Line line = Instantiate(this.line);line.gameObject.SetActive(true);line.transform.SetParent(transform);// 画线StartCoroutine(line.DrawRay(transform.position,pos1, ctrlPoint1, ctrlPoint2, pos2));// 状态恢复pos1 = Vector3.zero;pos2 = Vector3.zero;mouseClicks = 0;}}}}/// <summary>/// 自动发射虚拟地球信息射线/// </summary>/// <returns></returns>void AutoFireLine(){//this.line.gameObject.SetActive(false);invokeTime += Time.deltaTime;if (invokeTime > invokeDistance){// 循环生成曲线Line line = Instantiate(this.line);line.gameObject.SetActive(true);line.transform.SetParent(transform);// 在地球表面随机一个起始点Vector3 fromPos = SpawnRandPos();// 在地球表面随机一个终点Vector3 toPos = SpawnRandPos();// 计算其他点的坐标Vector3[] pos;pos = CountPoints(fromPos, toPos);Vector3 ctrlPoint1 = pos[0];Vector3 ctrlPoint2 = pos[1];StartCoroutine(line.DrawRay(transform.position,fromPos, ctrlPoint1, ctrlPoint2, toPos));// 状态恢复invokeTime = 0;invokeDistance = Random.Range(0.3f, 2f);}}// 控制点2pos[1] = toPos + (center - transform.position).normalized * (fromPos - toPos).magnitude * 0.6f;return pos;}//生成随机点private Vector3 SpawnRandPos(){// 半径float radius = transform.localScale.x / 2f;Vector3 Pos= transform.position + new Vector3(Random.Range(-1f, 1f), Random.Range(-1f, 1f), Random.Range(-1f, 1f)).normalized * radius;return Pos;}
}

line.cs

using System.Collections;
using SystEngine;public class Line : MonoBehaviour
{private LineRenderer lineRenderer;//lineRenderer组件private List<Vector3> posList = new List<Vector3>();//存储点坐标public int MAX_FRAG_CNT = 100;//曲线最大点数void Awake(){lineRenderer = GetComponent<LineRenderer>();}public Transform startPoint;//开始位置波纹粒子public Transform endPoint;  //结束位置波纹粒子/// <summary>/// 绘制曲线/// </summary>/// <param name="earthPos">虚拟地球位置</param>/// <param name="fromPos">起点坐标</param>/// <param name=trlPoint2">控制坐标2</param>/// <param name="toPos">终点坐标</param>/// <returns></returns>public IEnumerator DrawRay(Vector3 earthPos, Vector3 fromPos, Vector3 ctrlPoint1, Vector3 ctrlPoint2, Vector3 toPos){// 起始位置粒子startPoint.gameObject.SetActive(true);startPoint.forward = fromPos - earthPos;startPoint.localPosition = fromPos + startPoint.forward * 0.01f;for (int i = 0; i <= MAX_FRAG_CNT; ++i){posList.Clear();for (int j = 0; j <= i; ++j){posList.Add(cubicBezier(fromPos, ctrlPoint1, ctrlPoint2, toPos, (float)j / MAX_FRAG_CNT));}lineRenderer.positionCount = posList.Count;lineRenderer.SetPositions(posList.ToArray());yield return new WaitForSeconds(0.02f);}// 目标位置粒子endPoint.gameObject.SetActive(true);endPoint.forward =MAX_FRAG_CNT; ++i){posList.Clear();for (int j = i; j <= MAX_FRAG_CNT; ++j){posList.Add(cubicBezier(fromPos, ctrlPoint1, ctrlPoint2, toPos, (float)j / MAX_FRAG_CNT));}lineRenderer.positionCount = posList.Count;lineRenderer.SetPositions(posList.ToArray());yield return new WaitForSeconds(0.001f);}Destroy(gameObject);}/// <summary>/// 三阶贝塞尔曲线/// </summary>/// <param name="pos1">控制点1</param>/// <param name=private Vector3 cubicBezier(Vector3 pos1, Vector3 pos2, Vector3 pos3, Vector3 pos4, float t){Vector3 aa = pos1 + (pos2 - pos1) * t;Vector3 bb = pos2 + (pos3 - pos2) * t;Vector3 cc = pos3 + (pos4 - pos3) * t;return (aa + (bb - aa) * t) + ((bb + (cc - bb) * t) - (aa + (bb - aa) * t)) * t;}
}

创作不易 觉得有帮助请点赞关注收藏~~~

【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)相关推荐

  1. 将kubernetes制作成一个3D射击游戏,好玩的停不下来,附源码

    文章目录 前提条件 开始实践 构建自己的程序 原文 大家好,我是小碗汤,今天演示一个项目,利用Unity做场景.用C#做交互逻辑,将k8s制作成一个3D射击游戏.正好最近在学习Unity,所以利用这个 ...

  2. 将k8s制作成3D射击游戏,好玩到停不下来,附源码

      点击上方蓝字 关注[我的小碗汤] 大家好,我是小碗汤,今天演示一个项目,利用Unity做场景.用C#做交互逻辑,将k8s制作成一个3D射击游戏.正好最近在学习Unity,所以利用这个项目开始上手挺 ...

  3. Qt 3D开发案例:音频可视化器示例(附源码)

    Qt自带集成开发环境(IDE),名为Qt Creator.它可以在Linux.OS X和Windows上运行,并提供智能代码完成.语法高亮.集成帮助系统.调试器和剖析器集成,还集成了所有主要的版本控制 ...

  4. 表格控件SpreadJS开发案例:应收账款帐龄分析表(附源码)

    SpreadJS 是一款基于 HTML5 的纯前端电子表格控件,兼容 450 种以上的 Excel 公式,凭借其 "高性能.跨平台.与 Excel 高度兼容"的产品特性,备受以华为 ...

  5. CSS3动画大全(附源码)flex布局,grid布局3d旋转,图像模糊,文字发光

    CSS3动画大全(附源码)3d旋转,图像模糊,文字发光! 文章目录 CSS3动画大全(附源码)3d旋转,图像模糊,文字发光! html代码 css grid布局 flex布局 文字发光 & 图 ...

  6. 元宇宙里的虚拟数字人:十几分钟就能制作出人体3D模型

    元宇宙是虚拟世界与现实社会的交互平台,在虚拟世界里都有一个现实世界的复制品,包括真人模型,也就是元宇宙里的虚拟数字人,数字人的概念就出来了. 数字人就是逼真的人体3D模型.就是利用技术创造出来的虚拟人 ...

  7. 借游戏带动“卖铲”收益,“卖铲子”的Unity借元宇宙起飞?

    <王者荣耀><原神><英雄联盟手游>......当游戏公司借这些名声在外的作品掘金时,提供内容创作服务的Unity引擎则是那个"卖铲子"的人. ...

  8. Unity 3D 刚体(Rigidbody)|| Unity 3D 刚体实践案例

    Unity 3D 中的 Rigidbody 可以为游戏对象赋予物理特性,使游戏对象在物理系统的控制下接受推力与扭力,从而实现现实世界中的物理学现象. 我们通常把在外力作用下,物体的形状和大小(尺寸)保 ...

  9. 情人节浪漫3D照片墙【附源码】

    情人节浪漫3D照片墙[附源码] 博主介绍:

最新文章

  1. 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和
  2. 【Gradle】配置详解(持续更正补充)
  3. 信息学奥赛一本通(1111:不高兴的津津)
  4. Mac安装oracleVM VMware安装失败,解决方案
  5. 【Arthas】Arthas classloader类加载器
  6. 并发编程-concurrent指南-原子操作类-AtomicInteger
  7. redis php高级使用_项目中应用Redis+Php的场景
  8. mysql insert or update_MySQL insert or update SQL 示例
  9. shell脚本中的逻辑判断、文件目录属性判断、if特殊用法、case判断
  10. Matlab程序接口应用总结
  11. 最新STM32G0系列选型表1
  12. ZIGBEE协议栈如何低功耗(CC2530+ZIGBEE2.5)
  13. 马斯克发起投票:是否应该出售特斯拉10%的股票?超5成粉丝赞成
  14. 【python进阶】古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
  15. matlab实验报告井字棋,有偿井字棋游戏300+
  16. linux考出光盘数据,电脑如何复制数据到光盘|电脑在光盘中存储数据的方法
  17. 【机器学习笔记之五】用ARIMA模型做需求预测用ARIMA模型做需求预测
  18. Python爬虫学习第三章-4.3-使用xpath解析爬取全国城市名称
  19. 普通本科到清华大学研究生的真实人生蜕变,看了保证你考研至少增加 50 分!青春值得你去拼搏!!
  20. Matlab和C#混合编程

热门文章

  1. 索尼推出杜比全景声条形音箱HT-A5000,售价899.99美元
  2. 前端学习——JavaScript原生实现购物车案例
  3. linux ntp同步硬件时间同步,linux时钟同步操作案例
  4. 当我开始学习人工智能:人工智能的学派及研究目标
  5. 提交APP到三星应用市场一直提示不符合 Galaxy特色体验的类别条件
  6. Macbook Pro上安装Windows 7虚机
  7. 软件产品分析:华为软件开发云
  8. android usb调试软件,有没有什么android软件可以直接进行usb调试啊
  9. 微信重磅更新,打工人快升!
  10. 华为手机取消夜间模式方法分享