Unity地屏效果的简单实现流程
前言
记得去年我在北京的时候,通过面试进了一家做展馆展示的公司。这家公司规模挺大的,老板也很有气场,做的项目也不小。我进来后觉得我应该能干挺长时间的,但是我干了差不多不到一个月就主动离职了。有的时候就是这样,希望越大,失望越大。至于我为什么离开这家公司,大致就是工作太累,公司内部内卷太厉害,公司里的那些做设计的人经常自己就将程序的功能改来改去的。他们觉得改改需求很容易,动动笔就可以,殊不知程序员改代码是有多费劲。还有就是加起班来没时没点的,公司里管项目的小领导只会逼人干活,但是干完活了也没有相应的加班费和补偿,甚至连一句感谢都没有,仿佛一切都是理所应当的。可能我在这家公司最不能忍受的就是让我干一些和程序不相干的事情吧,这家公司甚至会让程序员去安装投影机,调试硬件设备,甚至管理工人穿线。后来我干完上海这个项目我就打算离职了,后来公司小领导又让我做那个环拍的项目,只给了7天的时间,我上海项目完成了还没有调休呐,这又让我天天加班。我心寒了,第二天就和公司提请了辞职信,离开了这家公司。
不过我在这家公司做的上海那个项目,虽然天天加班到深夜,但是确实也学到了不少的东西,做的其中有一个项目就是地屏互动程序。大概逻辑就是利用雷达,在地面上安装长方形显示屏,然后人在显示屏上走,脚踩到哪里,哪里就会出现开花的图案,同时利用串口通信向硬件设备发送信号,触发旁边的等亮起来。等人走过之后,图案消失,恢复水面动画,同时将旁边的触控灯灭掉。
这个项目的难点就是调试雷达进行触控。我记得当时用的北洋雷达进行的触发,将雷达设置成为连续点击,人在上面走,模拟鼠标连续点击的效果。我调试了整整一个晚上,连修改程序效果,最终实现了比较好的效果。不过公司可是一点儿都没念着我的好,在我提离职的时候,那领导那张脸拉的和驴脸一样,我问她我需要移交什么吗,她说我在公司什么都没干,什么都不用移交。正好,我也懒得移交了,省事了。说了那么多,言归正传,我开始说一下这个项目的大致实现步骤。
实现流程
其实我一开始听公司那个搞设计的需求,我本来设计的是将程序屏幕平均分成5部分,然后每一个部分成为一个触控区,人通过雷达踩上去触发相应的逻辑,产生相应的效果。后来那个设计说不行,必须按照之前的程序员做过的效果进行开发。后来我看了下之前的程序员写的代码,实现的逻辑是是通过点击屏幕产生一片粒子效果,然后检测有没有其他人点击,如果没有,则粒子消失。在这个基础上,我又进一步改进了代码。具体实现步骤如下。
一、在场景中新建一个Image组件,在这个组件上新建一个水纹动画,如下图所示:
二、新建一个粒子,将粒子的tag设置成grass,粒子效果和设置如下所示:
三、新建CloseGrass.cs脚本,并将该脚本挂载到粒子物体上,将粒子物体设置为预制体,脚本代码如下图所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CloseGrass : MonoBehaviour
{
//粒子效果
public ParticleSystem[] thisParticleSystem;
private void Start()
{
ToCloseThis();
}
/// <summary>
/// 播放完动画后销毁自己
/// </summary>
internal void ToCloseThis()
{
StartCoroutine(ToDesThis());
}
IEnumerator ToDesThis()
{
yield return new WaitForSeconds(3.0f);
for (int i = 0; i < thisParticleSystem.Length; i++)
{
thisParticleSystem[i].Stop();
}
yield return new WaitForSeconds(1.0f);
Destroy(this.gameObject);
}
}
四、新建MouseLeft0.cs脚本,实现通过点击鼠标产生粒子的效果,并且检测场景中粒子效果的数量,如果场景中粒子的数量小于5个,则点击鼠标时新建一个粒子。脚本代码如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MouseLeft0 : MonoBehaviour
{
public GameObject thisImage;
// Update is called once per frame
void Update()
{
ToShowImage();
}
void ToShowImage()
{
if (Input.GetMouseButtonDown(0))
{
ToCheckImage();
//Debug.Log("按下鼠标!");
}
}
void ToCreateGrass()
{
Vector3 targetposition = Camera.main.WorldToScreenPoint(thisImage.transform.position);//将物体的世界坐标转换为屏幕坐标
Vector3 mouseposition = Input.mousePosition;
mouseposition.z = targetposition.z;
float x = Camera.main.ScreenToWorldPoint(mouseposition)