一、 演示效果:
1.gif图演示
2.视频演示
https://tempsharefiles.oss-cn-shanghai.aliyuncs.com/demo.mp4
二、快速开始
1.下载插件
本插件主要内容为自主编写,部分功能利用到DOTween插件,仅供习使用, 下载地址如下:
https://tempsharefiles.oss-cn-shanghai.aliyuncs.com/Leaves.unitypackage
插件结构如下:
2.使用教程
1. 新建一个Canvas, 并在Canvas下新建一个Panel ,铺满Canvas,然后去掉Image组件
2. 将 LeavesSpawn 脚本挂到Panel上,并将Leaves List 的 Size 设为3
3. 将 Prefabs 文件夹下的 leaf1 、leaf2 、leaf3 赋值给 Leaves List ,然后运行,即可看到效果
4. 其中 Leaves List 的长度可改,leaf 预设体的图片可改,以达到增加落叶多样性的目的
三、代码概述:
1.LeavesLife.cs
LeavesLife.cs 脚本挂在预设体上,即 leaf 上 主要控制叶子飘落的方向、力度和生命周期
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class LeavesLife : MonoBehaviour
{
public float lifeTime;
float fade;
bool isTimeToFade;
// Start is called before the first frame update
void Start()
{
lifeTime = 8;
int x = Random.Range(4000, 6000);
int y = Random.Range(-6000, -4000);
int a = Random.Range(50, 200);
fade = (float)a / 255f;
transform.GetComponent<Image>().color = new Color(1, 1, 1, fade);
transform.GetComponent<Image>().DOFade(1, 6).OnComplete(()=>
{
transform.GetComponent<Image>().DOFade(0, 2);
});
transform.localScale = new Vector3(fade , fade , fade );
transform.GetComponent<Rigidbody2D>().AddRelativeForce(new Vector2(x, y));
}
// Update is called once per frame
void Update()
{
lifeTime -= Time.deltaTime;
if (lifeTime <= 0)
{
Destroy(gameObject);
}
transform.Rotate(Vector3.forward,Time.deltaTime*60);
}
}
2.LeavesSpwan.cs
LeavesSpwan.cs 脚本主要用做生成 leaf 使用 控制生成的叶子的数量、位置和样式
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LeavesSpwan : MonoBehaviour
{
public List<GameObject> leavesList = new List<GameObject>();
public List<Vector2> startPosList = new List<Vector2>();
// Start is called before the first frame update
void Start()
{
int posx = -1600;
for (int i = 0; i < 16; i++)
{
posx = -1600 + i * 200;
startPosList.Add(new Vector2(posx, 700));
}
StartCoroutine(SpawnLeaves());
}
IEnumerator SpawnLeaves()
{
while (true)
{
yield return new WaitForSeconds(1f);
for (int i = 0; i < leavesList.Count; i++)
{
int index = Random.Range(0, startPosList.Count);
GameObject leaf = Instantiate(leavesList[i],transform);
leaf.GetComponent<RectTransform>().anchoredPosition = startPosList[index];
leaf.GetComponent<Image>().SetNativeSize();
}
}
}
}