馨予带你飞之Unity对象池(一)

  第一篇博客,打算和大家分享一下关于Unity开发当中用到的对象池,那么何为对象池呢?

  【对象池】:对象池是一种经常用到的内存管理服务,它的作用在于可以减少从头创建每个对象的系统开销。

  众所周知,在Unity游戏开发的过程中经常会创建一些新的对象,如果数量较少还可以接受,如果创建的新对象数量庞大,那么对内存而言是一个极大的隐患。例如射击游戏当中,每发射一颗子弹,都要创建一个新的子弹对象,那么子弹是数量庞大,可想而知一场游戏当中会创建多少这样的新对象,那么如果这些子弹创建之后都对游戏起着关键且持续性的作用也无可厚非,问题是子弹发射完成之后,几秒之后就不再拥有任何的意义,一般会将它自动的隐藏,也就是我们所说的SetActive(false),因此大量的非活跃对象出现在游戏场景当中。

  为了解决大量创建重复对象造成的内存损耗,我们采用对象池的方式来解决。

  下面我用一个例子来演示  。

  自动生成一堵方块墙,通过点击屏幕来发射子弹,击塌这堵墙。

   

  代码如下:

  • 挂载到MainCamera上的射击脚本:
	RaycastHit hit;

	void Update()
	{
		Ray mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition);
		if(Input.GetMouseButtonDown(0))
		{
			Physics.Raycast(mouseRay,out hit);
			{
				GameObject cloneSph = GameControllerr.instance.CreateBall(transform.position,Quaternion.identity);
				Vector3 dir = (hit.point - transform.position).normalized;
				Rigidbody r = cloneSph.GetComponent<Rigidbody>();
				r.AddForce(dir * 500f);
			}
		}
	}
  • 挂载到子弹预设体上的自动隐藏脚本AutoDistroy:

	public void Init() {
		StartCoroutine(AutoHide());	
	}

	IEnumerator AutoHide()
	{
		yield return new WaitForSeconds(2f);
		GameControllerr.instance.AddBall(this.gameObject);
		gameObject.SetActive(false);
	}
  • 挂载到GameController空对象上的,总控制脚本GameControllerr:

public ArrayList arrList = new ArrayList ();
	public static GameControllerr instance;


	void Start()
	{
		instance = this;
	}

	public GameObject ReturnBall()
	{
		GameObject o = arrList[0] as GameObject;
		arrList.RemoveAt(0);
		return o;
	}

	public void AddBall(GameObject ball)
	{
		arrList.Add(ball);
	}

	public GameObject CreateBall(Vector3 pos,Quaternion rot)
	{
		GameObject newBall;
		if(arrList.Count>0)
		{
			newBall = ReturnBall();
			newBall.SetActive(true);
			newBall.transform.position = pos;
			newBall.transform.rotation = rot;
		}
		else
		{
			newBall = Instantiate(Resources.Load("Ball"),pos,rot) as GameObject;	
		}

		newBall.GetComponent<AutoDestroy>().Init();

		return newBall;
	}

  

posted @ 2015-03-04 17:28  欣羽馨予  阅读(572)  评论(1编辑  收藏  举报