首页
IT
登录
6mi
u
盘
搜
搜 索
IT
unity3D学习【功能实现】之八:对象池讲学习二
unity3D学习【功能实现】之八:对象池讲学习二
xiaoxiao
2025-10-13
2
第二部分: 1,首先这个
类
Gmpool
里面
都是静态
函数
static
,方便全局调用。
2,这个类有两个函数,就是两个功能,第一个就是创建和拿gameobject并
SetActive
(
true
)
;
,第二个是把gameobject放到里面并
SetActive
(
false
)
;
public
class
Gmpool
:
MonoBehaviour
{
public
static
Dictionary
<
string
,
ArrayList
>
dic
=
new
Dictionary
<
string
,
ArrayList
>
()
;
public
static
GameObject
getObj
(
string
prefabName
,
Vector3
position
,
Quaternion
rotation
){
go
=
(
GameObject
)
Instantiate
(
Resources
.
Load
(
"
prefabs
/
"
+
prefabName
)
,
position
,
rotation
)
;
return
go
;
//注意预制体要放在
Resources
/
prefabs
目录下,我的图片有
显示
getObj
()拿object,函数后面会扩展
}
先写这么个简单的。这个
Dictionary
是字典功能,
可以去前面
章节学习下,是用来存我们不用的
gameobject也就是
g
.
SetActive
(
false
)
的物体。 然后这么一个简单的函数在
Gmmanager
那边调用,会发生什么事情呢。
public
class
Gmmanager
:
MonoBehaviour
{
void
Update
()
{
if
(
Input
.
GetMouseButtonDown
(
0
)){
Gmpool
.
getObj
(
"
Cube
"
,
transform
.
position
,
transform
.
rotation
)
;
}
}
}
发生的事情就是和对象池讲解一里的一样,点下鼠标左键发射一个物体,物体一会自己摧毁。既然一样的话就没有什么卵用啊,所以发射后不能让他摧毁,让他不见也就是
SetActive
(
false
)
;
。所以先来到物体自身的代码
cubeForce
。
public
class
cubeForce
:
MonoBehaviour
{
public
float
mforce
;
void
Start
()
{
GetComponent
<
Rigidbody
>()
.
AddForce
(
Vector3
.
forward
*
mforce
)
;
}
IEnumerator
AutoHide
()
{
yield
return
new
WaitForSeconds
(
2f
)
;
Gmpool
.
returnObj
(
this
.
transform
.
gameObject
)
;
}
void
Update
(){
StartCoroutine
(
AutoHide
())
;
}
}
物体自身就做这么一件事,开始一个协程,2秒后来到
Gmpool
.
returnObj
这个函数。好了,我们继续来到
Gmpool这个类。看下
returnObj的代码
public
static
GameObject
returnObj
(
GameObject
g
){
string
key
=
g
.
name
;
if
(
dic
.
ContainsKey
(
key
))
{//先判断有没有这个名称的
key值,也就是Cube(Clone)
dic
[
key
]
.
Add
(
g
)
;//然后把物体装进去,其实确切的意思应该是让
dic
[
key
]
对应的数组元素指向g
}
else
{
dic
[
key
]
=
new
ArrayList
(){
g
}
;//这个就是没有
Cube(Clone)这个名字就建一个,在
g装进去
}
g
.
SetActive
(
false
)
;//把物体变不见
return
g
;
}
/// 这样就完成了什么功能的,就是鼠标点击一下,发射一个方块,然后过两秒方块消失---同时装到或者说藏到了
dic
[
key
]里面,也就是
dic
[
Cube(Clone)
]里面。 所以还有一个重要问题没有解决,就是不停的点击鼠标不停的新建出方块,那么内存也就不停的在消耗,所以应该创建方块的时候先判断
dic
[
key
]里面有没有现成的方块,有的话取出就可以了,除非没有,那只能
Instantiate
新建了。所以继续回到
Gmpool
类的这里函数
getObj
(
)
。
GameObject
go
;
string
gameObjname
=
prefabName
+
"
(
Clone
)
"
;//
prefabName
传进来的参数是
Cube,要组合下
if
(
dic
.
ContainsKey
(
gameObjname
)
&&
dic
[
gameObjname
]
.
Count
>
0
)
{
Debug
.
Log
(
"
有Cube字和有数组了
"
)
;//主要是判断
Count
>0
,说明有藏东西
的了
//
returnObj之后有数组了
,
g
.
SetActive
(
false
)了
ArrayList
tempList
=
dic
[
gameObjname
]
;//把东西先赋值给
tempList
这个临时变量
go
=
(
GameObject
)
tempList
[
0
]
;//把藏的第一个物体取出来,赋值给go这个临时变量
tempList
.
RemoveAt
(
0
)
;//
tempList
里面的第一个元素移除调,那么
之后tempList第一个可能有元素可能没元素了
go
.
SetActive
(
true
)
;//让物体
显示
出来
go
.
transform
.
position
=
position
;
go
.
transform
.
rotation
=
rotation
;
}
else
{
Debug
.
Log
(
"
什么都没有
"
)
;
go
=
(
GameObject
)
Instantiate
(
Resources
.
Load
(
"
prefabs
/
"
+
prefabName
)
,
position
,
rotation
)
;
}
return
go
;
这样就是这个对象池的整个顺序逻辑了。那么搞清楚之后,就可以自己加工了,比如什么时候
getObj
()
,什么时候
returnObj
()。都可以
由自己设计。
第三部分:
链接:http://pan.baidu.com/s/1slcQGZN 密码:gwr9
转载请注明原文地址: https://ju.6miu.com/read-1303123.html
最新回复
(
0
)