首先我对这个项目进行了一下大致要实现的功能划分,从开头到看了一点点教程到自己摸索着做其实分了三次,每一次都很痛苦,现在想来差不多是这样:
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脚本挂上,这样为什么可以运行呢?