개체 풀
대상 탱크의 주요 용도는 중복적으로 창설되고 소각되어야 하는 물체에서 중복적으로 창설하고 소각하지 않는 것이다. 예를 들어 총알은 사격할 때 창설되고 보통 물체에 맞거나 일정 거리(시간)를 비행한 후에 소각된다. 그리고 다시 한 번 사격하고 다시 이 조작을 반복할 수 있다. 그러나 여러 번 창설하고 소각하는 것은 성능을 소모한다는 것을 알아야 한다.대상 탱크는 이렇게 총알을 처리할 수 있다. 사격할 때 대상 탱크에 활성화되지 않은 총알이 있는지 확인하고 없으면 새로운 총알을 만들고 새로운 총알을 대상 탱크에 넣고 사격한다.낡은 탄알을 활성화한 다음에 그 파라미터를 리셋한 다음에 그것을 사격하여 물체에 맞히거나 일정 거리(시간)를 비행한 후에 소각하지 않고 바로 숨긴다. 그러면 이미 만들어진 탄알을 중복 이용하고 활성화와 숨기기 조작만 하면 성능을 크게 절약할 수 있다.
그럼 구체적으로 코드를 보자, 총알을 예로 들자.
현재 세 개의 스크립트를 썼는데 하나는 총알이다. 주로 총알의 속도, 비행 거리, 초기 위치, 이동, 소각, 충돌 하나는 무기이다. 주로 총알이 쏘는 위치가 있다. 대응하는 유형의 총알의 복제체를 만들고 대상 탱크에 넣는다. 하나는 대상 탱크에 넣는다. 모든 복제체를 저장하는 사전이 있다. 태그를 키로 하고 사전을 넣는 방법이 있다.또 어떤 유형의 복제체를 찾는 방법, 물체를 리셋하는 방법이 있다
이렇게 해서 가장 간단한 총알 대상 탱크를 구성하였다
우선 총알 코드:
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;
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.