跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

AR红包雨特效 三

六、制作红包雨效果 1.新建一个脚本,名为为“RedPacketItem”。

(代码如下)

using UnityEngine;

//管理红包的下落和旋转效果 public class RedPacketItem : MonoBehaviour { ///

红包存在的边界 public float boundaryY { get; set; } /// 移动速度 public float moveSpeed { get; set; } /// 旋转速度 public float rotateSpeed { get; set; } private bool isShow = true;

private RedPackEffect redPackEffect;

private void OnEnable() { isShow = true; }

private void OnDisable() { isShow = false; }

private void Start() { redPackEffect = FindObjectOfType(); }

private void Update() { if (!isShow) return; transform.Translate(new Vector3(0, moveSpeed, 0));

if (transform.localPosition.y < boundaryY) { redPackEffect.Death(transform.gameObject); }

transform.Rotate(new Vector3(0, rotateSpeed, 0)); } }

2.新建一个脚本,名为为“RedPackEffect”。

(代码如下)

using System.Collections;

using System.Collections.Generic; using UnityEngine;

///

管理红包效果 public class RedPackEffect : MonoBehaviour { /// 模型父物体 private Transform parent; /// 红包的预制体 public GameObject redPackPrefab; /// 孵化器 public List nestArr = new List();

///

已经死亡的红包(对象池) private Queue deathRedPacket = new Queue();

///

红包下落边界 public float boundaryY=-1000; /// 生成红包的速率 public float rate = 0.2f; /// 红包下落最小速度 public float moveMiniSpeed = -3f; /// 红包下落最大速度 public float moveMaxSpeed = -10f; /// 红包旋转最小速度 public float rotateMiniSpeed = -5; /// 红包旋转最大速度 public float rotateMaxSpeed = 5; /// 最小的红包 public float miniSize = 1000; /// 最大的红包 public float maxSize = 2000;

private void Awake() { createParent(); hideNest();

InvokeRepeating("generateRedPack", 0, rate); }

///

/// 红包死亡 /// /// 死亡的红包 public void Death(GameObject obj) { obj.SetActive(false); deathRedPacket.Enqueue(obj); }

///

隐藏孵化器的显示 private void hideNest() { for(int i=0;i< nestArr.Count;i++) { MeshRenderer meshRenderer= nestArr[i].gameObject.GetComponent(); if (meshRenderer != null) meshRenderer.enabled = false; } }

///

创建红包的父物体 private void createParent() { GameObject go = new GameObject("RedPackParent"); go.transform.localPosition = Vector3.zero; go.transform.localScale = Vector3.one; go.transform.localEulerAngles = Vector3.zero; parent = go.transform; }

///

生成红包效果 private void generateRedPack() { generateOneRedPack(); }

///

生成一个红包 private void generateOneRedPack() { GameObject obj = getRedPack(); obj.transform.position = getPostion(); obj.transform.localScale = getSize();

RedPacketItem redPacketItem = obj.GetComponent(); if (redPacketItem == null) { redPacketItem = obj.AddComponent(); } redPacketItem.moveSpeed = getMoveSpeed(); redPacketItem.rotateSpeed = getRotateSpeed(); redPacketItem.boundaryY = boundaryY;

}

///

获取一个红包模型(优先从对象池中获取红包) private GameObject getRedPack() { if (deathRedPacket == null || deathRedPacket.Count == 0) { GameObject item = Instantiate(redPackPrefab, parent); return item; }

GameObject obj = (GameObject)deathRedPacket.Dequeue(); return obj; }

///

获取模型的大小(随机生成模型大小) private Vector3 getSize() { float size = Random.Range(miniSize, maxSize); return new Vector3(size, size, size); }

///

生成红包的位置 private Vector3 getPostion() { Transform nest = nestArr[Random.Range(0, nestArr.Count)]; Vector3 nestPos = nest.transform.localPosition; Vector3 nestSize = nest.transform.localScale;

float x = Random.Range(0, nestSize.x / 2); float z = Random.Range(0, nestSize.z / 2); int randomX = Random.Range(0, 2); int randomZ = Random.Range(0, 2); x = (randomX == 0) ? nestPos.x + x : nestPos.x - x; z = (randomZ == 0) ? nestPos.z + z : nestPos.z - z;

return new Vector3(x, nestPos.y, z); }

///

获取红包下落的速度 private float getMoveSpeed() { float speed = Random.Range(moveMiniSpeed, moveMaxSpeed); return speed; }

///

获取红包旋转速度 private float getRotateSpeed() { float speed = Random.Range(rotateMiniSpeed, rotateMaxSpeed); return speed; }

}

3.新建一个空文件命名为“RedPackEffect”,将“RedPackEffect.cs”挂载上去 4.创建红包孵化模型,用来标记红包孵化的范围

5.给RedPackEffect 类,属性赋值(如下图所示)

6.将“Main Camera”的 Clear Flags 模式改为 Depth only

7.在Canvas下创建一个 Camera ,命名为“UICamera”。

8.将 UICamera 的属性设置如下图

9.将 Canvas 的Render Mode 改为 ScreenSpace-Camera,并将Render Camera 赋值为 UICamera(如下图所示)

10.大功告成!

文件资料 源码下载链接:  https://pan.baidu.com/s/1t2xQQY-IcGT2GboRUIL-yA 提取码: nwo1 欢迎对AR技术感兴趣的朋友,加入QQ群:883655607 讨论

相关文章