Unity功能 小鱼一边向前移动,一边转弯

场景中挂载生成鱼的脚本

鱼生成的脚本

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);//旋转
	}
}

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值