using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BionicUnit
{
    public enum BionicUnitType
    {
        Marine,
        Medic
    }
    public BionicUnitType type;
    public string name;
    public BionicUnit(BionicUnitType type, string name)
    {
        this.type = type;
        this.name = name;
    }

}

 

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class DropShip : MonoBehaviour
{
    //마린과 메딕을 관리할 리스트
    public List<BionicUnit> units = new List<BionicUnit>();
    //최대로 태울 수 있는 인원의 수
    public const int CAPACITY = 8;
    void Start()
    {
        //생성자를 만든다
        BionicUnit medic = new BionicUnit(BionicUnit.BionicUnitType.Medic, "메딕");
        BionicUnit marine1 = new BionicUnit(BionicUnit.BionicUnitType.Marine, "마린1");
        BionicUnit marine2 = new BionicUnit(BionicUnit.BionicUnitType.Marine, "마린2");
        BionicUnit marine3 = new BionicUnit(BionicUnit.BionicUnitType.Marine, "마린3");
        BionicUnit marine4 = new BionicUnit(BionicUnit.BionicUnitType.Marine, "마린4");
        BionicUnit marine5 = new BionicUnit(BionicUnit.BionicUnitType.Marine, "마린5");
        BionicUnit marine6 = new BionicUnit(BionicUnit.BionicUnitType.Marine, "마린6");
        BionicUnit marine7 = new BionicUnit(BionicUnit.BionicUnitType.Marine, "마린7");
        BionicUnit marine8 = new BionicUnit(BionicUnit.BionicUnitType.Marine, "마린8");

        LoadUnit(medic);
        LoadUnit(marine1);
        LoadUnit(marine2);
        LoadUnit(marine3);
        LoadUnit(marine4);
        LoadUnit(marine5);
        LoadUnit(marine6);
        LoadUnit(marine7);
        LoadUnit(marine8);
        UnLoad(medic);
        UnLoadAll();
    }
    public void LoadUnit(BionicUnit unit)
    {
        if (units.Count >= CAPACITY)
        {
            Debug.Log("<color=red> 자리가 없어서 탑승에 실패 </color>");
        }
        else
        {
            units.Add(unit);
            Debug.LogFormat("{0}이 탑승했습니다. ({1}/{2})", unit.type, units.Count, CAPACITY);
            //Debug.LogFormat("{0}이 탑승했습니다. ({1}/{2})", unit.name, units.Count, CAPACITY);
        }
    }
    public void UnLoad(BionicUnit unit)
    {
        this.units.Remove(unit);
        Debug.LogFormat("{0}이 하차했습니다. ({1},{2})", unit.type, units.Count, CAPACITY);
    }
    public void UnLoadAll()
    {
        Debug.Log("모두 하차 시작");
        foreach (BionicUnit unit in units.ToList())
        //()이나 Start() 메서드에서 units 리스트를 수정하지 않도록 합니다. 리스트를 수정할 필요가 있다면 반복문 밖에서 수정
        {
            UnLoad(unit);
        }
    }
}

이런식으로 .ToList()를 쓰지 않으면 오류가 난다.

이유를 찾아보니 멤버변수에 선언한 "원본" 리스트를 변경시키기 때문에 나는 현상이라고 한다.

따라서 해결방법은 list를 새로 만들어서 다시 copy본으로 저장을 하거나

.ToList()를 사용하면된다.

 

자바스크립트에서 문자열을 자를 때 사용하는 splice와 같은 개념인가?

✔ Array.prototype.splice()

 

 

 

 

 

 

만약 unit을 하나씩이 아닌 원하는 수만큼 내리게 하고 싶다면?

int형으로 인자를 하나 더 받으면 된다.

 

'산대특 > 게임 클라이언트 프로그래밍' 카테고리의 다른 글

Quaternion  (1) 2024.03.04
Dodge game  (0) 2024.03.04
코루틴 연습  (0) 2024.03.03
StarCraft - Tank  (0) 2024.02.29
Find the nearest object  (0) 2024.02.27

+ Recent posts