unity学习笔记

发布时间:2023年12月26日

一、实例化地图其他物体

现在将地图继续丰富物体,要实例化墙、障碍、草、河流。每个物体都实例化一定数量,需要使用之前写的产生随机坐标的方法。

//实例化地图
? ? ? ? for(int i = 0; i < 150; i++)
? ? ? ? {
? ? ? ? ? ? Instantiate(item[1], CreateRandomPosition(), Quaternion.identity);
? ? ? ? }?
? ? ? ? for(int i = 0; i < 20; i++)
? ? ? ? {
? ? ? ? ? ? Instantiate(item[2], CreateRandomPosition(), Quaternion.identity);
? ? ? ? }?
? ? ? ? for(int i = 0; i < 20; i++)
? ? ? ? {
? ? ? ? ? ? Instantiate(item[4], CreateRandomPosition(), Quaternion.identity);
? ? ? ? }?
? ? ? ? for(int i = 0; i < 20; i++)
? ? ? ? {
? ? ? ? ? ? Instantiate(item[5], CreateRandomPosition(), Quaternion.identity);
? ? ? ? }
实例化效果如下:

实例化玩家

由于玩家出生时有一个特效,因此只需要实例化这个出生特效就行,让出生特效再去示例化玩家。

在出生特效的脚本里面有个IsPlayer属性,来控制是否为玩家,因此在实例化时需要将这个布尔值设置为true。

? ? ? ? //初始化玩家
? ? ? ? GameObject go = Instantiate(item[3], new Vector3(-2,-8,0),Quaternion.identity);?
? ? ? ? go.GetComponent<BornControl>().isPlayer = true;

在一些位置随机产生敌人,并且每格一段时间之后还会继续产生敌人

? ? ? ? //产生敌人
? ? ? ? CreatItem(item[3],new Vector3(-10,8,0),Quaternion.identity);
? ? ? ? CreatItem(item[3],new Vector3(0,8,0),Quaternion.identity);
? ? ? ? CreatItem(item[3],new Vector3(10,8,0),Quaternion.identity);

写一个方法用于后续敌人的产出

private void CreateEnemy()
? ? {
? ? ? ? int num = Random.Range(0, 3);
? ? ? ? Vector3 Enemy = new Vector3();
? ? ? ? if(num == 0)
? ? ? ? {
? ? ? ? ? ? Enemy = new Vector3(-10, 8, 0);
? ? ? ? }else if(num == 0)
? ? ? ? {
? ? ? ? ? ? Enemy = new Vector3(0, 8, 0);
? ? ? ? }else if(num == 0)
? ? ? ? {
? ? ? ? ? ? Enemy = new Vector3(10, 8, 0);
? ? ? ? }
? ? ? ? CreatItem(item[3], Enemy, Quaternion.identity);
? ? }

该方法时是根据不同的随机数来参数不同位置的敌人。

这个方法要达到每隔一段时间就调用,因此可以使用名为 InvokeRepeating()的api,

第一个参数是方法名,

第二个参数是延迟几秒后第一次调用,

第三个参数是每隔多长时间就调用一次。

InvokeRepeating("CreateEnemy", 4, 5);

这个效果是每给五秒调用一次,第一次调用为延迟四秒。

效果如下:

由于敌人在相互遇见时会出现静止不移动的情况,因此将优化敌人的AI,当两个敌人相遇时就立刻转向。

在原本的逻辑里

? ? ? ? if (timeValChangeDirection > 4)
? ? ? ? {
? ? ? ? ? ? int num = Random.Range(0, 8);
? ? ? ? ? ? if (num >= 5)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? h = 0;
? ? ? ? ? ? ? ? v = -1;
? ? ? ? ? ? }else if (num == 4)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? h = 0;
? ? ? ? ? ? ? ? v = 1;
? ? ? ? ? ? }else if (num >= 2 && num <=3)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? h = 1;
? ? ? ? ? ? ? ? v = 0;
? ? ? ? ? ? }else if (num < 2)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? h = -1;
? ? ? ? ? ? ? ? v = 0;
? ? ? ? ? ? }
? ? ? ? ? ? timeValChangeDirection = 0;

? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? timeValChangeDirection += Time.fixedDeltaTime;
? ? ? ? }

只有当timeValChangeDirection = 4时才会发生移动,现在我们要只要两个敌人相遇就将其设置为4。

为敌人物体写一个碰撞检测的方法

? ? private void OnCollisionEnter2D(Collision2D collision)
? ? {
? ? ? ? if(collision.gameObject.tag == "Enemy")
? ? ? ? {
? ? ? ? ? ? timeValChangeDirection = 4;
? ? ? ? }
? ? }

这样敌人在相遇时就会发生转向,让其看起来跟自然。

文章来源:https://blog.csdn.net/2301_79022588/article/details/135200659
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。