본문 바로가기
유니티 기초

몬스터 클릭하면 사라지고 랜덤 위치에 포탈 생성하기

by 노재두내 2023. 8. 10.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameEnums 
{
   public enum eMonsterType
    {
        Turtle,Slime
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace Test3
{
    public class Test_CreatePortalMain : MonoBehaviour
    {
        [SerializeField]
        private MonsterGenerator monsterGenerator;
        private List<MonsterController> monsterList;
        [SerializeField]
        private GameObject portalPrefab;
        // Start is called before the first frame update
        void Start()
        {
            this.monsterList = new List<MonsterController>();
            MonsterController turtle = this.monsterGenerator.Generate(GameEnums.eMonsterType.Turtle,new Vector3(-3,0,0));//제너레이터야 만들어라
            MonsterController slime = this.monsterGenerator.Generate(GameEnums.eMonsterType.Slime, new Vector3(0, 0, 3));

            this.monsterList.Add(turtle);
            this.monsterList.Add(slime);
            Debug.LogFormat("this.monsterList.Count: {0}", this.monsterList.Count);
            foreach (MonsterController monster in monsterList)
            {
                Debug.LogFormat("monster{0}", monster);
            }
        }

        // Update is called once per frame
        void Update()
        {
            //Test 클릭해서 죽이기
            //ray연습할겸 클릭해서 선택 몬스터를 제거하자
            //화면을 클릭하면 ray를 만든다.
            //ray 사용해서 충돌체크한다
            //충돌을 감지해서 해당 몬스터를 씬에서 제거한다.
            if (Input.GetMouseButtonDown(0))
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                Debug.DrawRay(ray.origin, ray.direction * 100f, Color.red, 3f);
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit, 100f))
                {
                    if (hit.collider.tag == "Monster")
                    {
                        
                        MonsterController controller =hit.collider.gameObject.GetComponent<MonsterController>();
                        this.monsterList.Remove(controller);
                        Destroy(hit.collider.gameObject);
                        Debug.LogFormat("this.monsterList.Count: {0}", this.monsterList.Count);

                        
                        
                    }
                    int x = Random.Range(-4, 4);
                    int z = Random.Range(-4, 4);
                    if (this.monsterList.Count <= 0)
                    {
                        GameObject portalGo=Instantiate(portalPrefab);
                        portalGo.transform.position = new Vector3(x, 0, z);
                    }
                }
            }
            
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace Test3
{
    public class MonsterController : MonoBehaviour
    {
        // Start is called before the first frame update
        void Start()
        {

        }

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

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

namespace Test3
{
    public class MonsterGenerator : MonoBehaviour
    {
        //[SerializeField] private GameObject turtlePrefab;
        //[SerializeField] private GameObject slimePrefab;

        [SerializeField]
        private List<GameObject> prefabList;//동적 배열(컬렉션은 사용전 반드시 인스턴스화)
        // Start is called before the first frame update
        void Start()
        {
            foreach(GameObject prefab in this.prefabList)
            {
                Debug.LogFormat("prefabs{0}", prefab);
            }
        }

        // Update is called once per frame
       
        /// <summary>
        /// 몬스터 생성
        /// </summary>
        /// <param name="monsterType">생성하려고 하는 몬스터의 타입</param>
        /// <param name="initPosition">생성된 몬스터의 월드 좌표</param>
        public MonsterController Generate(GameEnums.eMonsterType monsterType,Vector3 initPosition)
        {
            Debug.LogFormat("monsterType{0}", monsterType);
            //몬스터 타입에 따라 어떤 프리팹으로 프리팹 복사본(인스턴스)를 생성할ㅈ ㅣ결정 해야함
            int index = (int)monsterType;
            Debug.LogFormat("index{0}", index);

            GameObject prefab = this.prefabList[index];
            Debug.LogFormat("prefab{0}", prefab);
            GameObject go = Instantiate(prefab);
            //동적으로 컴포넌트 부착
            //if (go.GetComponent<MonsterController>() == null)
            //{
            //    MonsterController controller = go.AddComponent<MonsterController>();
            //}
            //if (go.GetComponent<MonsterController>() != null)
            //{
            //    Destroy(go.GetComponent<MonsterController>());
            //}
            go.transform.position = initPosition;

            //if (monsterType == GameEnums.eMonsterType.Turtle)
            //{
            //    Instantiate(this.prefabList[0]);
            //}
            //else if (monsterType == GameEnums.eMonsterType.Slime)
            //{
            //    Instantiate(this.prefabList[1]);
            //}
            return go.GetComponent<MonsterController>();
        }
    }
}

'유니티 기초' 카테고리의 다른 글

히어로 이동  (0) 2023.08.10
몬스터 죽으면 아이템 생성  (0) 2023.08.10
rpg monster 복습  (0) 2023.08.08
rpg monster  (0) 2023.08.08
dd  (1) 2023.08.08