关于青蛙忍者开发过程中的一些问题和收获

文章详细介绍了在Unity3D中实现对象池管理的过程,包括木板预制体的创建、对象池的初始化和管理,以及如何使用PoolManager脚本来协调对象的创建和回收。同时,文章也探讨了在游戏逻辑中如何处理角色运动、死亡、动画和分数判定等问题。
摘要由CSDN通过智能技术生成

首先我对这个项目进行了一下大致要实现的功能划分,从开头到看了一点点教程到自己摸索着做其实分了三次,每一次都很痛苦,现在想来差不多是这样:

1)做两排自下而上运动的木板,每排用一个用对象池管理,生成点在屏幕外,两排x坐标不同,上升到某个y坐标值时销毁再生

但是这里有一个问题,初始的时候界面上是需要有木板的,这里不太懂怎么用对象池管理,在对象池里初始化几个吗,那运动函数又怎么写呢

2)角色运动逻辑:看演示应该是获取鼠标在屏幕上点击拖动的向量,然后让角色以固定的速度朝向量的反方向运动,碰到木板时角色本身的速度清零,然后跟随撞到的木板一起运动。

这个属于是完全不会做了

3)角色死亡逻辑:角色碰到场景边

应该写在脚本里,判断位置然后

4)动画逻辑:角色跟随木板运动时播放待机动画,跳跃时播放翻滚动画,碰到边界时播放死亡动画,然后接下落动画

5)分数判定:把木板分为三个得分段,玩家控制的角色碰到哪一个点,就以该点计算得分

6)特效演出:音效、角色拖尾、分数变化

针对第一点的实现:

1)木板预制体

prefab预制体其实是可重复使用的资源和模板

1.在场景窗口中创建empty

2.对创建的物体进行一系列属性修改

3.将修改完成的物体拖入资源窗口

即可创作出可复用的预制体

2)对象池

Pool脚本

pool的类变量是对象池所管理的预制体(GameObject类型)、对象池的容量、

调用池中对象的队列,以及一个不知道是什么类也不知道是干嘛用的的transform parent

首先是初始化函数

public void Initialize(Transform parent)
    {
        queue = new Queue<GameObject>();
        //开始运行的时候要创建新队列
        this.parent = parent;
        //传入父对象,不过这父对象哪里传进来的
        for(var i=0; i < size; i++)
        {
            queue.Enqueue(Copy());
            //创建出的新复制体入列
        }

    }

初始化函数中调用了copy函数,

GameObject Copy()
    {
        var copy = GameObject.Instantiate(Prefab,parent);
        //给cpoy找一个父对象的作用是什么呢,父对象又是什么呢
        copy.SetActive(false);
        //先禁用
        return copy;
    }

Instantiate函数实例化是将original对象的所有子物体和子组件完全复制,成为一个新的对象。这个新的对象拥有与源对象完全一样的东西,包括坐标值等,返回复制出的新Object。
original:用来做复制操作的对像物体,源对象

parent:实例化对象的父对象,在完成实例化函数处理后,实例化对象将在父对象下,是父对象的子对象

SetActive()函数是启用或者禁用某个object

GameObject AvailableObject()
    {
        //取出一个物体来用
        GameObject availableObject = null;

        if (queue.Count > 0 && !queue.Peek().activeSelf)
        {
            //队列不为空且队列顶部元素未激活时
            availableObject = queue.Dequeue();
            //取出队列顶部元素
        }
        else
        {   //如果队列为空,新建一个来用
            availableObject = Copy();
        }
        queue.Enqueue(availableObject);
        //新建的元素也需要入列

        return availableObject;
    }
public GameObject PreparedObject(Vector3 position)
    {

        //启用空闲的物体,并指定其初始位置

        GameObject preparedObject = AvailableObject();

        preparedObject.SetActive(true);
        preparedObject.transform.position = position;

        /*不过为什么是三维向量呢,这个向量我要怎么给进来呢,还有这个返回值是给谁的呢,
这个脚本又怎么运行呢,它又没有main函数*/
        return preparedObject;
    }

这个脚本又应该挂在什么上面呢,为什么呢

PoolManager脚本

继承了MonoBehaviour类,一个框架类罢了

MonoBehaviour 类提供了框架,允许您将脚本附加到编辑器中的游戏对象,并提供诸如 Start 和 Update 等常用事件的挂钩。

PoolManager的类变量是一个Pool数组以及一个字典,字典的键值分别是GameObject对象和Pool对象,目前意义不明

我现在在思考是不是一个pool类里只能存一个预制体啊😵所以才又创建了一个数组调用?

void Start()
    {
        //给字典实例化
        dictionary = new Dictionary<GameObject, Pool>();
        //调用初始化函数,不过这个初始化是什么意思呢,pool脚本里不是写了吗
        Initialize(playerBarPools);
    }
void Initialize( Pool[] pools)
    {
        //一个pool类不是有队列可以存很多个预制体吗,为什么还要定义pool数组呢
        foreach(var pool in pools)
        {

            if (dictionary.ContainsKey(pool.Prefab))
            {
                Debug.LogError("Same prefab in multiple pools! Prefab: " + pool.Prefab.name);
                continue;
            }
            //把没有重复的预制体加入pool数组的每一个pool里
            dictionary.Add(pool.Prefab, pool);

            /*创建一个transform对象,这个对象是当前对象池预制体的transform属性?括号里的参数是什么意思?*///哦,原来是创建类似父级文件夹的东西
            Transform poolParent=new GameObject("Pool: " + pool.Prefab.name).transform;
            poolParent.parent = transform;
            //等下,这transform哪来的,把父对象设成什么了这是
            pool.Initialize(poolParent);
            //这个pool初始化,创建了size大小的队列并让复制体入列
        }
    }
public static GameObject Release(GameObject prefab)
    {
        //释出指定GameObject
        if (!dictionary.ContainsKey(prefab))
        {//指定预制体不存在就报错
            Debug.LogError("Pool Manager could NOT find prefab: " + prefab.name);

            return null;
        }
        //存在就返回一个激活的。。。对象池?
        return dictionary[prefab].PreparedObject();
    }
public static GameObject Release(GameObject prefab,Vector3 position)
    {//在指定位置释出指定物体
        if (!dictionary.ContainsKey(prefab))
        {
            Debug.LogError("Pool Manager could NOT find prefab: " + prefab.name);

            return null;
        }
        
        return dictionary[prefab].PreparedObject(position);
    }

在场景中创建了一个空物体将PoolManager脚本挂上,这样为什么可以运行呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值