场景中挂载生成鱼的脚本
鱼生成的脚本
using UnityEngine;
using System.Collections;
public class FishMaker : MonoBehaviour {
public Transform fishHolder;//存放鱼的节点
public Transform[] genPositions;//所有的鱼的Transform
public GameObject[] fishPrefabs;//所有鱼的预设
public float waveGenWaitTime = 0.3f;//每波生成间隔的时间
public float fishGenWaitTime = 0.5f;//每条鱼之间生成的间隔
void Start () {
InvokeRepeating("MakeFishes", 0, waveGenWaitTime);//循环生成鱼
}
//生成本批次鱼
void MakeFishes()
{
int genPosIndex = Random.Range(0, genPositions.Length);//随机一个起点
int fishPreIndex = Random.Range(0, fishPrefabs.Length);//随机一条鱼
int maxNum = fishPrefabs[fishPreIndex].GetComponent<FishAttr>().maxNum;//获取本批鱼最大的数量
int maxSpeed = fishPrefabs[fishPreIndex].GetComponent<FishAttr>().maxSpeed;//获取本批鱼的速度
int num = Random.Range((maxNum / 2) + 1, maxNum);//保证最小数量大于0
int speed = Random.Range(maxSpeed / 2, maxSpeed);//保证最小速度
int moveType = Random.Range(0, 2);//行走模式 0:直走,1:转弯
int angOffset;//仅直走生效,直走的倾斜角
int angSpeed;//仅转弯生效,转弯的角速度
if(moveType == 0)
{
//直走鱼群的生成
angOffset = Random.Range(-22, 22);//随机一个倾斜角度
StartCoroutine(GenStraightFish(genPosIndex, fishPreIndex, num, speed, angOffset));
}
else
{
//转弯鱼群的生成
//转弯的角速度
if(Random.Range(0,2) == 0)//是否取负的角速度
{
angSpeed = Random.Range(-15, -9);
}
else
{
angSpeed = Random.Range(9, 15);
}
StartCoroutine(GenTrunFish(genPosIndex, fishPreIndex, num, speed, angSpeed));
}
}
//生成直走的鱼
IEnumerator GenStraightFish(int genPosIndex,int fishPreIndex,int num,int speed,int angOffset)
{
for(int i = 0; i < num; i++)
{
GameObject fish = Instantiate(fishPrefabs[fishPreIndex]);
fish.transform.SetParent(fishHolder, false);//设置鱼的父物体,第二个参数是不用系统计算坐标
fish.transform.localPosition = genPositions[genPosIndex].localPosition;//获取起点
fish.transform.localRotation = genPositions[genPosIndex].localRotation;//获取旋转角度
fish.transform.Rotate(0, 0, angOffset);//旋转鱼的倾斜角
fish.GetComponent<SpriteRenderer>().sortingOrder += i;//设置层级排序
fish.AddComponent<Ef_AutoMove>().speed = speed;//挂载自动移动的脚本,并设置移动速度
yield return new WaitForSeconds(fishGenWaitTime);//等待时间执行下一次
}
}
//生成转弯的鱼
IEnumerator GenTrunFish(int genPosIndex, int fishPreIndex, int num, int speed, int angSpeed)
{
for (int i = 0; i < num; i++)
{
GameObject fish = Instantiate(fishPrefabs[fishPreIndex]);
fish.transform.SetParent(fishHolder, false);//设置鱼的父物体,第二个参数是不用系统计算坐标
fish.transform.localPosition = genPositions[genPosIndex].localPosition;//获取起点
fish.transform.localRotation = genPositions[genPosIndex].localRotation;//获取旋转角度
fish.GetComponent<SpriteRenderer>().sortingOrder += i;//设置层级排序
fish.AddComponent<Ef_AutoMove>().speed = speed;//挂载自动移动的脚本,并设置移动速度
fish.AddComponent<Ef_AutoRotate>().speed = angSpeed;//挂载自动旋转的脚本
yield return new WaitForSeconds(fishGenWaitTime);//等待时间执行下一次
}
}
}
自动移动的脚本
using UnityEngine;
//自动移动的脚本
public class Ef_AutoMove : MonoBehaviour {
public float speed = 1f;//速度
public Vector3 dir = Vector3.right;//移动方向
void Update () {
transform.Translate(dir * speed * Time.deltaTime);//移动
}
}
自动转弯的脚本
using UnityEngine;
//自动转弯的脚本
public class Ef_AutoRotate : MonoBehaviour {
public float speed = 10f;
void Update () {
transform.Rotate(Vector3.forward, speed * Time.deltaTime);//旋转
}
}