개체 풀

5626 단어
인터넷에서 대상지의 응용을 보고 궁금해서 연구를 해봤어요.
대상 탱크의 주요 용도는 중복적으로 창설되고 소각되어야 하는 물체에서 중복적으로 창설하고 소각하지 않는 것이다. 예를 들어 총알은 사격할 때 창설되고 보통 물체에 맞거나 일정 거리(시간)를 비행한 후에 소각된다. 그리고 다시 한 번 사격하고 다시 이 조작을 반복할 수 있다. 그러나 여러 번 창설하고 소각하는 것은 성능을 소모한다는 것을 알아야 한다.대상 탱크는 이렇게 총알을 처리할 수 있다. 사격할 때 대상 탱크에 활성화되지 않은 총알이 있는지 확인하고 없으면 새로운 총알을 만들고 새로운 총알을 대상 탱크에 넣고 사격한다.낡은 탄알을 활성화한 다음에 그 파라미터를 리셋한 다음에 그것을 사격하여 물체에 맞히거나 일정 거리(시간)를 비행한 후에 소각하지 않고 바로 숨긴다. 그러면 이미 만들어진 탄알을 중복 이용하고 활성화와 숨기기 조작만 하면 성능을 크게 절약할 수 있다.
그럼 구체적으로 코드를 보자, 총알을 예로 들자.
현재 세 개의 스크립트를 썼는데 하나는 총알이다. 주로 총알의 속도, 비행 거리, 초기 위치, 이동, 소각, 충돌 하나는 무기이다. 주로 총알이 쏘는 위치가 있다. 대응하는 유형의 총알의 복제체를 만들고 대상 탱크에 넣는다. 하나는 대상 탱크에 넣는다. 모든 복제체를 저장하는 사전이 있다. 태그를 키로 하고 사전을 넣는 방법이 있다.또 어떤 유형의 복제체를 찾는 방법, 물체를 리셋하는 방법이 있다
이렇게 해서 가장 간단한 총알 대상 탱크를 구성하였다
우선 총알 코드:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

namespace tomo
{
    public class bullet : MonoBehaviour
    {

        // Use this for initialization
        public float speed;
        public float distance;
        private Vector3 start_pos;

        void Awake()
        {
            start_pos = transform.position;
        }
        void Start()
        {

        }

        // Update is called once per frame
        void Update()
        {                     
            Move();            

        }
        
        private void Move()
        {
            transform.GetComponent().velocity = Vector3.forward * speed * Time.deltaTime;
            destroy(distance);
           
        }
        private void destroy(float dis) 
        {
            float D = Vector3.Distance(start_pos, transform.position);
            if (D >= dis)
            {
                transform.gameObject.SetActive(false);
            } 
        }
        void OnTriggerEnter(Collider collider)
        {
            if (collider.transform.name == "Cylinder")
            {
                transform.gameObject.SetActive(false);
            }
        }
    }
}

무기 코드:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

namespace tomo
{
    public class weapon : MonoBehaviour
    {

        public GameObject Bullet;
        public Transform shootPostion; 
               

        // Use this for initialization
        void Start()
        {

        }

        // Update is called once per frame
        void Update()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                Create_Bullet(shootPostion.position);
            } 
               
        }
        public void Create_Bullet(Vector3 sp)
        {
            List list = pool.getObj(Bullet);
            if (list.Count > 0)
            {              
                pool.reset(list[0], sp, transform.rotation);                
                list[0].SetActive(true);
                //return list[0];
            }
            else
            {
                GameObject obj = GameObject.Instantiate(Bullet, sp, transform.rotation) as GameObject;
                pool.inputObj(obj);
                //return obj;
            }
        }
    }
}


객체 풀 코드:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
namespace tomo {
    public class pool : MonoBehaviour {

        // Use this for initialization
        //public static List pooledObj = new List();
        public static Dictionary> dictionary = new Dictionary>();

        void Start() {

        }

        // Update is called once per frame
        void Update() {

        }

        // 
        public static void inputObj(GameObject obj)
        {
            //Debug.Log("......"+obj);
            //pooledObj.Add(obj);
            var tagString = obj.tag;
            
            if (dictionary.ContainsKey(tagString))
            {
                dictionary[tagString].Add(obj);
            }
            else
            {
                List list = new List();
                list.Add(obj);
                dictionary.Add(tagString, list);
            }            
        }

        public void OnClickShowDictionary()
        {
            foreach (var item in dictionary.Keys)
            {
                var list = dictionary[item];
                foreach (var it in list)
                {
                    Debug.LogError("tag " + it.tag + " name " + it.name);
                }
            }
        }
        // 
        public static List getObj(GameObject obj)
        {
            List list = new List();
            foreach (var tag in dictionary.Keys)
            {
                if (tag == obj.tag)
                {
                    List dic_list = dictionary[tag];
                    for (int i = 0; i < dic_list.Count; i++)
                    {
                        if (dic_list[i].activeSelf == false)
                        {
                            list.Add(dic_list[i]);
                        }
                    }
                }
            }
            
            return list;
        }

        public static void reset(GameObject obj, Vector3 position, Quaternion rotation)
        {
            obj.transform.position = position;
            obj.transform.rotation = rotation;
  
        }
    }
}

좋은 웹페이지 즐겨찾기