ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리스트 (List)
    유니티/유니티 코드 2024. 2. 13. 17:57

    <List>

    리스트 : 하나의 목록처럼 배열과 유사한 방식으로 데이터들을 저장하는 컨테이너

    배열 같은 경우는 크기가 생성 당시의 크기로 제한되기 때문에, 크기 변경을 위해서는 배열을 새로 만들어야 한다

    하지만 리스트는 배열의 크기가 동적으로 바뀌기 때문에 메모리가 허용하는 만큼 자동으로 늘어난다

     

    또 데이터가 순차적으로 저장되는 *연속적인 특성을 가진다.

    * 연속적 : 데이터가 서로 연결되어 있어 다음 데이터의 주소지를 쉽게 찾아갈 수 있다.

                    또, 다음 데이터의 주소지를 알고 있기 때문에 반복문 사용에 적합하다

     

    우선 List의 선언은

                          List<자료형> 변수명 = new List<자료형>();

                    ex) List<int> num = new List<int>();                    이 기본이다

                                  var  num = new List<int>();                     var를 쓰면 더 간단하게도 가능하다

     

     

    Add 함수를 사용하여 리스트 안에 값을 집어넣을수 있다

                            num.Add(1);            => 0번째 배열에 값 1을 넣겠다는 뜻

     

    Insert 함수를 사용하면 값을 중간에 껴넣을수도 있다

                           num.Insert(2,5)       => 3번째 배열에 값 5을 넣겠다는 뜻

     

    값을 다 집어넣고 나면 출력하는 방법은 크게 2가지다

     

    For문으로 출력하기

    for(int i=0; i > num.Length; i++)
    {
       Debug.Log(num[i]);
    }

     

    Foreach문으로 출력하기

    Foreach(var i in num)
    {
      Debug.Log(i)
    }

     

    Contains 함수를 사용하여 찾는값이 리스트안에 있는지 확인할 수 있다

    Debug.LogFormat("{0} is Exist? = {1}", 1, num.Contains(1));

    값 1이 배열안에 들어있는지 확인하는 중. True, False로 반환된다

     

    Indexof 함수를 사용해 찾는값이 몇번째 위치에 있는지 확인할 수 있다

    Debug.LogFormat("{0} is Exist? = {1}", 1, num.Indexof(1));

    찾는값이 2번째 배열에 있다면 1, 배열에 없다면 -1을 출력한다

     

    Remove 함수를 사용해 리스트의 값을 지울 수 있다

    num.Remove(1);

     

    만약 값 1이 여러개 있다면 가장 앞에 있는 값을 지워준다

     

    RemoveAt 함수를 사용해 원하는 위치에 있는 값을 지울수도 있다

    num.RemoveAt(1);

    위 함수와 거의 비슷해보이지만 1은 값이 아닌 위치를 나타내는것이다

     

    마지막으로 Clear 함수를 사용해 리스트 안에 있는 모든값을 지울수 있다

     

    조금 더 응용하여 코드를 만들어본다면 이렇게 만들수 있다

    using UnityEngine;
    using System.Collections.Generic;
    
    public class ObjectManager : MonoBehaviour
    {
        private List<GameObject> objectList = new List<GameObject>();
    
        private void Start()
        {
            objectList.Add(GameObject.Find("Player"));
            objectList.Add(GameObject.Find("Enemy1"));
            objectList.Add(GameObject.Find("Enemy2"));
            objectList.Add(GameObject.Find("Item"));
    
            PrintObjectList1();
            PrintObjectList2();
        }
    
        private void PrintObjectList1()
        {
            Debug.Log("오브젝트 목록:");
            foreach (GameObject obj in objectList)
            {
                Debug.Log("- " + obj.name);
            }
        }
        private void PrintObjectList2()
        {
           Debug.Log("오브젝트 목록:");
           for(i=0; i<objectList.Length; i++)
           {
              Debug.Log(objectList[i]);
           }
    }

     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class ScoreManager : MonoBehaviour
    {
    
        public List<int> scores = new List<int>();
    
        private void Update()
        {
            if(Input.GetMouseButtonDown(0))
            {
                int randomNumber = Random.Range(0, 100);
                scores.Add(randomNumber);
            }
    
            if(Input.GetMouseButtonDown(1))
            {
                scores.RemoveAt(3);
            }
        }
    }

    아주 간단한 응용도 가능하다

    마우스 좌측 버튼을 누르면 0~100 사이의 수들 중 랜덤으로 스코어 리스트에 추가. 

    마우스 우측 버튼을 누르면 3번째 배열에 있는 수를 삭제

     

     

    Copy array to List

     

    이런 식으로 생성자를 이용해서 만든 배열의 요소를 List에 매개 변수로 전달해 복사할 수 있다

        internal class Program
        {
            static void Main(string[] args)
            {
                int[] arr = new int[3];
                arr[0] = 1;
                arr[1] = 2;
                arr[2] = 3;
    
                List<int> list = new List<int>(arr);
                List<int> list = new List<int>(new int[] {1. 2. 3}); 이렇게도 가능하다
                Console.WriteLine(list.Count);
            }
        }

     

     

    using JetBrains.Annotations;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class NewBehaviourScript : MonoBehaviour
    {
    
        void Start()
        {
            List<Animal> fense = new List<Animal>();
            Animal goat = new Animal("염소");
            Animal lion = new Animal("사자");
    
            //염소, 사자 만든뒤 울타리에 넣어주기
    
            fense.Add(goat);
            fense.Add(lion);
    
            foreach (var animal in fense)
            {
                Debug.Log(animal.name);
            }
    
            ////두번째 출력방법
            //for(int i = 0; i < fense.Count; i++)
            //{
            //    Animal animal = fense[i];
            //    Debug.Log(animal.name);
            //}
        }
    }
    
    public class Animal
    {
        public string name;
        public Animal(string name)
        {
            this.name = name;
        }
    }
    using System.Collections;
    using System.Collections.Generic;
    using UnityEditor.Rendering;
    using UnityEngine;
    
    public class Zoo : MonoBehaviour
    {
        List<Item> backpack;
        List<Tier> tier;
    
        void Start()
        {
            backpack = new List<Item>();
            tier = new List<Tier>();
    
            Item sword = new Item(Item.WeaponType.SWORD);
            Tier swordtier = new Tier(Tier.TierType.Epic);
            //Debug.Log(sword);
            //Debug.Log(sword.type);   
    
            backpack.Add(sword);
            tier.Add(swordtier);
    
            Item dagger = new Item(Item.WeaponType.DAGGER);
            Tier daggertier = new Tier(Tier.TierType.Legendary);
    
            //Debug.Log(dagger); 
            //Debug.Log(dagger.type);
    
            backpack.Add(dagger);
            tier.Add(daggertier);
          
            for (int i = 0; i < backpack.Count; i++)
            {
                Item item = backpack[i];
                Tier itemtier = tier[i];
                Debug.Log(item);
                Debug.Log(item.type);
                Debug.Log(itemtier.ttype);
            }
        }
    }
    
    public class Item
    {
        public enum WeaponType
        {
            SWORD, DAGGER
        }
    
        public WeaponType type;
    
        public Item(WeaponType type)
        {
            this.type = type;
        }
    }
    
    public class Tier
    {
        public enum TierType
        {
            Normal, Magic, Epic, Rare, Legendary
        }
    
        public TierType ttype;
    
        public Tier(TierType type)
        {
            this.ttype = type;
        }
    }
    using System.Collections;
    using System.Collections.Generic;
    using UnityEditor.Rendering;
    using UnityEngine;
    
    public class Zoo : MonoBehaviour
    {
        List<BioUnit> unitsum;
        List<DropShip> tier;
    
        void Start()
        {
            unitsum = new List<BioUnit>();
            tier = new List<DropShip>();
    
            BioUnit marin = new BioUnit(BioUnit.UnitType.Marin);
            BioUnit medic = new BioUnit(BioUnit.UnitType.Medic);
    
            for (int i = 0; i < 6; i++)
            {
                unitsum.Add(marin);
                Debug.Log("마린이 생성되었습니다");
            }
    
            
            for (int i = 0; i < 4; i++)
            {
                unitsum.Add(medic);
                Debug.Log("메딕이 생성되었습니다");
            }
    
            for (int i = 1; i < unitsum.Count+1; i++)
            {
                BioUnit biounit = unitsum[i];
                Debug.Log(biounit.type+ "이 탑승하였습니다 (" + i + "/8)");
                if(i>=8)
                {
                    Debug.Log("더 탑승할 수 없습니다");
                    break;
                }
            }
    
            for (int i = unitsum.Count; i > 1; i--)
            {
                BioUnit biounit = unitsum[i];
                Debug.Log(biounit.type + "이 내렸습니다 (" + i + "/8)");
                if (i < 1)
                {
                    Debug.Log("더 내릴 유닛이 없습니다");
                    break;
                }
            }
        }
    }
    
    //마린 메딕은 타입 바이오닉 유닛 드롭쉽에 바이오닉 유닛들을 태우면 됨
    
    public class BioUnit
    {
        public enum UnitType
        {
            Marin, Medic
        }
    
        public UnitType type;
    
        public BioUnit(UnitType type)
        {
            this.type = type;
        }
    }
    
    public class DropShip
    {
        public enum TierType
        {
        }
    
        public TierType ttype;
    
        public DropShip(TierType type)
        {
            this.ttype = type;
        }
    }
    using System.Collections;
    using System.Collections.Generic;
    using UnityEditor.Rendering;
    using UnityEngine;
    
    public class Zoo : MonoBehaviour
    {
        void Start()
        {
            List<Vulture> vulture = new List<Vulture>();
            Debug.Log("Vulture가 생성되었습니다");
    
            Vulture spider = new Vulture(Vulture.WeaponType.SpiderMine);
    
            for (int i = 0; i < 3; i++)
            {
                vulture.Add(spider);
                Debug.Log("SpiderMine 생성되었습니다");
            }
    
            for(int i = 2; i > -1; i--)
            {
                Debug.Log("지뢰를 매설합니다 (" + i + "/3)");
            }
            Debug.Log("더 이상 지뢰가 없습니다");
        }
    }
    
    public class Vulture
    {
        public enum WeaponType
        {
            SpiderMine
        }
    
        public WeaponType type;
    
        public Vulture(WeaponType type)
        {
            this.type = type;
        }
    }

    '유니티 > 유니티 코드' 카테고리의 다른 글

    Vector3.Reflect  (0) 2024.03.19
    Collision.Contact[]  (0) 2024.03.19
    코루틴 (Coroutine)  (1) 2024.02.14
    foreach  (0) 2024.02.14
    딕셔너리 (Dictionary)  (0) 2024.02.13
Designed by Tistory.