본문 바로가기

GAME/게임제작

중간저장

728x90

 

 

 

inventory.cs

아이템을 먹었을 때 실행되는 AddInventory(GameOjbect itemObj) <- 매개변수가 먹은 아이템(프리팹)

아이템이 퀘스트용이고 열쇠이면, GameManager.

if(itemData.items[iteminfo.itemId].itemType == ItemType.Quest) //아이템이 퀘스트용이면
                        {
                            if (itemObj.gameObject.GetComponent<ObjData>().id == 200)
                            {//열쇠 
                                PlayerMove.instance.scanObject = itemObj;
                                Debug.Log(PlayerMove.instance.scanObject.name);
                                GameManager.instance.Action(PlayerMove.instance.scanObject);
                            }
                        }

 

 

 

 

 

 

inventory.cs

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

public class Inventory : MonoBehaviour
{
    public bool isOpenInventory;
    public GameObject bag;

    //Script
    public ItemData itemData;
    public BagScript bagScript;

    public static Inventory instance;
    bool isSlotEmpty;
    // Start is called before the first frame update
    void Start()
    {
        instance = this;
        isOpenInventory = false;
        //AddSlots(slotCount);
        bag.SetActive(true);
        //bag.SetActive(false);
    }

    // Update is called once per frame
    public void Update()
    {
        if (!isOpenInventory)
        {
            bag.SetActive(false);
        }
        if (Input.GetButtonDown("Inventory")) //i 버튼을 누르면 인벤토리 창이 뜸
        {
            openInventory();
        }
    }

    public void openInventory()
    {
        isOpenInventory = !isOpenInventory;
        bag.SetActive(isOpenInventory);
    }

    public void AddInventory(GameObject itemObj) //인벤토리에 아이템 추가
    {
        int itemNum=0;
        // Debug.Log("AddInventory 함수 실행"); ->실행됨
        Sprite itemImage;
        ItemInfo iteminfo = itemObj.GetComponent<ItemInfo>();

        SlotScript slotScript;
        slotScript = bagScript.slotList[0].gameObject.GetComponent<SlotScript>();

        if (itemObj.GetComponent<ItemInfo>().itemId != 1)
        {
            isSlotEmpty = true;
            for (int i = 0; i < bagScript.slotCount; i++) //인벤토리 안에 같은 id 가진 아이템이 있을 때 먼저, 없을때 나중에
            {
                Debug.Log("인벤토리 for문 안으로 들어옴");
                slotScript = bagScript.slotList[i].gameObject.GetComponent<SlotScript>();
                if (slotScript.SlotItemId == iteminfo.itemId)
                { //같은 id 가진 아이템 있을 때는 수량 추가
                    isSlotEmpty = false;
                    Debug.Log("같은 id 가진 아이템 있을 때");
                    slotScript.SlotItemCount++;
                    itemNum = slotScript.SlotItemCount;
                    break;
                }
                else if (slotScript.isSlotEmpty) //비었을 때 아이템 이미지 넣기
                {
                    /*
                    Debug.Log("인벤토리 비어있음!");
                    isSlotEmpty = true;
                    itemImage = itemData.items[iteminfo.itemId].itemImage;
                    bagScript.slotList[i].gameObject.GetComponent<Image>().sprite = itemImage;
                    bagScript.slotList[i].gameObject.GetComponent<Image>().color = new Color(1, 1, 1, 1);
                    slotScript.isSlotEmpty = false;
                    slotScript.SlotItemId = iteminfo.itemId;
                    slotScript.SlotItemCount++;
                    itemNum = slotScript.SlotItemCount;
                    */
                    //break;
                }
            }

            if (isSlotEmpty) //정말로 인벤토리에 같은 아이템이 들어있지 않을 때
            {
                slotScript = bagScript.slotList[0].gameObject.GetComponent<SlotScript>();

                for (int i = 0; i < bagScript.slotCount; i++)
                {
                    slotScript = bagScript.slotList[i].gameObject.GetComponent<SlotScript>();

                    if (slotScript.isSlotEmpty)
                    {
                        itemImage = itemData.items[iteminfo.itemId].itemImage;
                        
                        bagScript.slotList[i].gameObject.GetComponent<Image>().sprite = itemImage;
                        bagScript.slotList[i].gameObject.GetComponent<Image>().color = new Color(1, 1, 1, 1);
                        slotScript.isSlotEmpty = false;
                        slotScript.SlotItemId = iteminfo.itemId;
                        slotScript.SlotItemCount++;
                        itemNum = slotScript.SlotItemCount;
                        if (itemData.items[iteminfo.itemId].itemSlot <= slotScript.SlotItemCount) 
                            //퀘스트용 아이템일 경우에 하나만 얻으면 그 다음부터는 못 얻도록
                            itemData.items[iteminfo.itemId].isSatisfyQuest = true; 
                        if(itemData.items[iteminfo.itemId].itemType == ItemType.Quest) //아이템이 퀘스트용이면
                        {
                            if (itemObj.gameObject.GetComponent<ObjData>().id == 200)
                            {//열쇠 
                                PlayerMove.instance.scanObject = itemObj;
                                Debug.Log(PlayerMove.instance.scanObject.name);
                                GameManager.instance.Action(PlayerMove.instance.scanObject);
                            }
                        }
                        break;
                    }
                }
                
            }
            slotScript.ItemTextUpdate(itemNum);
            Debug.Log("아이템 개수 업데이트");
        }
    }
}

 

 

PlayerMove.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class PlayerMove : MonoBehaviour
{
    //스크립트
    public MonsterMove monster;
    public Hurdle thorn;
    public QuestManager questManager;
    public ItemInfo itemInfo;

    //public GameManager gameManager;

    public static PlayerMove instance;

    public GameObject scanObject; //스캔한 오브젝트 저장 

    public int maxHP;
    public int hp;
    public int Attack_Range;//다음 행동지표를 결정할 변수
    public int op;

    GameObject NPC;

    bool isDie = false;

    public float maxSpeed;
    public float jumpPower;
    public int direction;
    float detect_range = 6.5f;

    //public Hurdle thorn;

    Rigidbody2D rigid;
    SpriteRenderer spriteRenderer;
    Animator anim;
    CapsuleCollider2D capcollider;
    [SerializeField] private Transform returnZone;

    // Start is called before the first frame update
    void Start()
    {
        instance = this;
        maxHP = 100 + GameManager.instance.Level * 25;
        hp = maxHP;
        Attack_Range = 5;
        direction = 1;
        op = 10 + GameManager.instance.Level * 2;
    }



    void Awake()
    {
        capcollider = GetComponent<CapsuleCollider2D>();
        rigid = GetComponent<Rigidbody2D>();
        spriteRenderer = GetComponent<SpriteRenderer>();
        anim = GetComponent<Animator>();

    }

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

        //점프
        if (Input.GetButtonDown("Jump") && !anim.GetBool("isJump"))
        {
            if(GameManager.instance.isAction){ //대화창이 켜져있을 떄는 무조건 action을 실행(다음 대사로 넘어가도록 )
                GameManager.instance.Action(GameManager.instance.scanObject);
            }
            else{ // 대화창이 닫혀있을 떄는 
                if (scanObject != null) //조사액션이 수행되면(앞에 뭐가 있으면)
                {
                GameManager.instance.Action(scanObject); //조사액션으로 액션수행 
                //questManager.CheckQuestId(scanObject);
                //Debug.Log(scanObject.name);
                }
                else//뭐없으면 점프
                {
                rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
                anim.SetBool("isJump", true);
                }

            }

    /*
            //if(GameManager.instance.scanObject != null)
            //{
            //    GameManager.instance.Action(scanObject);
            //}
            if (scanObject != null)
            {
                GameManager.instance.Action(scanObject);
                //questManager.CheckQuestId(scanObject);
                //Debug.Log(scanObject.name);
            }
            else if(GameManager.instance.scanObject !=null && GameManager.instance.scanObject.name == "Item_Key(Clone)")
            {
                Debug.Log("스캔은널 게임은 널아님");
                GameManager.instance.Action(GameManager.instance.scanObject);
            }
            else
            {
                rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
                anim.SetBool("isJump", true);
            }

    */
        }

        //멈추기 -> 미끄럼방지?
        if (Input.GetButtonUp("Horizontal"))
        {
            rigid.velocity = new Vector2(rigid.velocity.normalized.x * 0.5f, rigid.velocity.y);
        }

        //방향 전환
        if (GameManager.instance.isAction == false && Input.GetButton("Horizontal"))
        {
            if (Input.GetAxisRaw("Horizontal") == -1)
            {
                direction = -1;
                spriteRenderer.flipX = true;
            }
            else
            {
                spriteRenderer.flipX = false;
                direction = 1;
            }
        }

        //공격
        if (Input.GetButtonDown("Attack"))
        {
            //애니메이션 실행
            anim.SetTrigger("isAttack");

            //몬스터를 감지하는 레이를 발사 
            Vector2 detect_mon = new Vector2(rigid.position.x, rigid.position.y - 2.5f);
            Debug.DrawRay(detect_mon, new Vector3(direction * Attack_Range, 0, 0), Color.blue); //빔을 쏨

            //감지되는 몬스터 레이어를 저장 
            RaycastHit2D raycast_monster = Physics2D.Raycast(detect_mon, new Vector3(direction, 0, 0), Attack_Range, LayerMask.GetMask("Monster"));

            //null이 아닐경우 : 무언가 공격에 닿음 
            if (raycast_monster.collider != null)
            {
                Debug.Log(raycast_monster.collider.name);
                //애니메이션이 실행되는 동안 
                if (anim.GetCurrentAnimatorStateInfo(0).IsName("Player_Attack"))
                {
                    //레이에 닿은 몬스터를 공격 
                    OnAttack(raycast_monster.transform);
                }

            }



        }

        //애니메이션
        if (Mathf.Abs(rigid.velocity.x) < 0.3)
            anim.SetBool("isRun", false);
        else
            anim.SetBool("isRun", true);


        //생명
        if (hp <= 0)
        {
            if (!isDie)
                Die();

            return;
        }

        //NPC   
        //if (Input.GetButtonDown("Jump") && NPC != null)
        //{
        //    Debug.Log("This is : " + NPC.name);
        //}

    }



    void FixedUpdate()
    {

        //조사액션

        //Ray
        //if (scanObject == null)
        //{
            Debug.DrawRay(transform.position, new Vector3(direction * detect_range, 0, 0), new Color(0, 0, 1));

            //Layer가 Object인 물체만 rayHit_detect에 감지 
            RaycastHit2D rayHit_detect = Physics2D.Raycast(transform.position, new Vector3(direction, 0, 0), detect_range, LayerMask.GetMask("Object"));

            //감지되면 scanObject에 오브젝트 저장 
            if (rayHit_detect.collider != null)
            {
                scanObject = rayHit_detect.collider.gameObject;
                //Debug.Log(scanObject.name);

            }
            else
            {
                scanObject = null;
                //Debug.Log("null");
            }
        //}

        //점프
        //if (Input.GetButtonDown("Jump") && !anim.GetBool("isJump"))
        //{
        //   rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
        //   anim.SetBool("isJump", true);
        //}

        float h = GameManager.instance.isAction ? 0 : Input.GetAxisRaw("Horizontal");
        Move();

        Jump(); //점프 빔쏘기 

        //덩쿨 올라가기        
        Vector2 frontVec = new Vector2(rigid.position.x, rigid.position.y);
        Debug.DrawRay(frontVec, Vector3.right * 1, new Color(0, 1, 0));
        RaycastHit2D raycast = Physics2D.Raycast(frontVec, Vector3.right, 0.1f, LayerMask.GetMask("Structure"));

        if (raycast.collider != null)
        {
            anim.SetBool("isHanging", true);

            if (Input.GetButtonDown("Jump"))
            {
                //덩쿨에서 점프하면 빠져나오는 부분
                rigid.constraints = RigidbodyConstraints2D.None | RigidbodyConstraints2D.FreezeRotation;
                transform.position = new Vector2(transform.position.x + h * 2, transform.position.y);
                rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
                anim.SetBool("isHanging", false);
                anim.SetBool("isJump", true);

                Jump();

            }
            else
            {
                //덩쿨 올라가는 부분
                rigid.constraints = RigidbodyConstraints2D.FreezePositionX | RigidbodyConstraints2D.FreezePositionY;
                if (Input.GetButton("Vertical"))
                {
                    rigid.constraints = RigidbodyConstraints2D.None | RigidbodyConstraints2D.FreezeRotation | RigidbodyConstraints2D.FreezePositionX;
                    float updown = Input.GetAxisRaw("Vertical");
                    rigid.AddForce(Vector2.up * updown * 10, ForceMode2D.Impulse);
                }
            }
        }
        else
        {
            anim.SetBool("isHanging", false);
        }







        /*
                Vector2 detect_object = new Vector2(rigid.position.x, rigid.position.y - 3f);
                Debug.DrawRay(detect_object, new Vector3(direction * 5, 0, 0), Color.red); //빔을 쏨
                RaycastHit2D raycast_object = Physics2D.Raycast(detect_object, new Vector3(direction, 0, 0), 5, LayerMask.GetMask("NPC"));


                if (raycast_object.collider != null)
                {
                    NPC = raycast_object.collider.gameObject;
                }
                else
                {
                    NPC = null;
                }

        */
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        //구덩이에 빠지면 saveJone에서 다시 떨어지게 하기
        if (hp > 0)
        {
            if (other.CompareTag("Return"))
            {
                GameManager.instance.isEnterSaveJone = true;

            }
        }

        if (other.CompareTag("deadline"))
        {
            if (hp > 0)
            {
                hp = hp - 20;
                if (GameManager.instance.isEnterSaveJone)
                {
                    transform.position = returnZone.position;
                    StartCoroutine("Blinking");
                    gameObject.layer = 12;
                    Invoke("OffDamaged", 2);
                }
                else
                    transform.position = new Vector2(100f, 20f);

                //NPC = null;
            }
            else
            {
                Die();
            }
        }

        //아이템 먹기
        if (other.CompareTag("Item"))
        {
            if (other.gameObject.name.Contains("Coin"))
            {
                Debug.Log("먹은 코인: " + other.gameObject.GetComponent<ItemInfo>().money);
                GameManager.instance.money += other.gameObject.GetComponent<ItemInfo>().money;
                GameManager.instance.GetMoney();
                Debug.Log("총 코인 수: " + GameManager.instance.money);
                //money += enemyMove.money_result();
            }

            Inventory.instance.AddInventory(other.gameObject);
            other.gameObject.SetActive(false);        
            //Destroy(other.gameObject);
        }
    }

    private void OnCollisionEnter2D(Collision2D other)
    {
        //x를 누르고 있을 때 충돌시?? 
        //if(other.gameObject.tag == "Monster"){

        //    if(anim.GetCurrentAnimatorStateInfo(0).IsName("Player_Attack")){
        //        OnAttack(other.transform);
        //    }
        //Obstacle 콜라이더 때문에 충돌이밴트 못생겨서 타일맵으로 다시찍어야함 
        //    else{
        //       OnDamaged(other.transform.position);
        //   }

        //}

        if (other.gameObject.tag == "Monster")
        {
            OnDamaged(other.transform.position);
            //부딪힌 오브젝트(몬스터)의 스크립트 가져오기 
            monster = other.gameObject.GetComponent<MonsterMove>();
            hp = hp - monster.op;

        }

        else if (other.gameObject.tag == "Obstacle")
        {
            OnDamaged(other.transform.position);
            thorn = other.gameObject.GetComponent<Hurdle>();
            hp = hp - thorn.op;
        }

        else if (other.gameObject.tag == "Door")
        {
            SceneManager.LoadScene("Map2");
        }
    }


    void OnDamaged(Vector2 tartgetPos)
    {
        if (hp > 0)
        {
            gameObject.layer = 12; //playerDamaged Layer number가 12로 지정되어있음 

            //깜박이는 함수를 불러오기 
            StartCoroutine("Blinking");


            //맞으면 튕겨나가는 모션
            int dirc = transform.position.x - tartgetPos.x > 0 ? 1 : -1;
            //튕겨나가는 방향지정 -> 플레이어 위치(x) - 충돌한 오브젝트위치(x) > 0: 플레이어가 오브젝트를 기준으로 어디에 있었는지 판별
            //> 0이면 1(오른쪽으로 튕김) , <=0 이면 -1 (왼쪽으로 튕김)
            rigid.AddForce(new Vector2(dirc, 1) * 20, ForceMode2D.Impulse); // *7은 튕겨나가는 강도를 의미 


            Invoke("OffDamaged", 2); //2초의 딜레이 (무적시간 2초)
        }
        else
        {
            // 생명이 0이하면 죽음

            //플레이어가 죽는 모션(이패트)
            Die();

            //UI에 결과 출력
            Debug.Log("죽었습니다.");


        }
    }

    //깜빡이는함수 
    IEnumerator Blinking()
    {

        //Debug.Log("Blink");
        int countTime = 0;

        while (countTime < 10)
        {
            if (countTime % 2 == 0)
            {
                spriteRenderer.color = new Color(1, 1, 1, 0.4f);
            }
            else
            {
                spriteRenderer.color = new Color(1, 1, 1, 0.7f);
            }
            yield return new WaitForSeconds(0.3f);
            countTime++;
        }

        spriteRenderer.color = new Color(1, 1, 1, 1);

        yield return null;
    }

    void OnAttack(Transform enemy)
    {

        MonsterMove enemyMove = enemy.GetComponent<MonsterMove>();
        enemyMove.OnDamaged(op);

        if (enemyMove.hp < 0)
        {
            enemyMove.Die();

        }

        if (GameManager.instance.exp >= 100)
        {
            GameManager.instance.LevelUp();
        }

    }



    void OffDamaged()
    { //무적해제함수 
        gameObject.layer = 8; //플레이어 레이어로 복귀함

        spriteRenderer.color = new Color(1, 1, 1, 1); //투명도를 1로 다시 되돌림 

    }

    void Move()
    {
        //이동
        float h = GameManager.instance.isAction ? 0 : Input.GetAxisRaw("Horizontal");
        rigid.AddForce(Vector2.right * h * 3, ForceMode2D.Impulse);

        //최대 속력
        if (rigid.velocity.x > maxSpeed) //Right Max Speed  velocity : 리지드바디의 현재 속도
        {
            rigid.velocity = new Vector2(maxSpeed, rigid.velocity.y);
        }
        else if (rigid.velocity.x < maxSpeed * (-1)) //Left Max Speed
        {
            rigid.velocity = new Vector2(maxSpeed * (-1), rigid.velocity.y);

        }
    }

    void Jump()
    {
        //점프 판단 위한 빔쏘기
        if (rigid.velocity.y < 0)
        {
            Debug.DrawRay(rigid.position, Vector3.down * 4.7f, new Color(0, 1, 0)); //빔을 쏨
            RaycastHit2D rayHit = Physics2D.Raycast(rigid.position, Vector3.down, 4.7f, LayerMask.GetMask("Platform"));
            if (rayHit.collider != null) //빔에 맞는 내용물이 있을 때
            {
                //if (rayHit.distance < 4f)
                anim.SetBool("isJump", false);
            }
        }
    }

    void Die()
    {

        isDie = true;

        rigid.velocity = Vector2.zero;

        //죽음 effect(외적인거)

        //Sprite Alpha : 색상 변경 
        spriteRenderer.color = new Color(1, 1, 1, 0.4f);

        //Sprite Flip Y : 뒤집어지기 
        spriteRenderer.flipY = true;

        //Collider Disable : 콜라이더 끄기 
        capcollider.enabled = false;

        //Die Effect Jump : 아래로 추락(콜라이더 꺼서 바닥밑으로 추락함 )
        rigid.AddForce(Vector2.down * 20, ForceMode2D.Impulse);

        GameManager.instance.UIRestartBtn.SetActive(true);

    }

}

 

 

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

public class QuestManager : MonoBehaviour
{

    public ItemData itemData;
    public int questId;
    public int questActionIndex; //퀘스트 npc대화 순서
    Dictionary<int, QuestData> questList;
    public GameObject[] questObject;



    void Awake()
    {
        questList = new Dictionary<int, QuestData>();
        GenerateData();
    }


    void GenerateData()
    {
        //생성자 이용 (string name, int[] npcid)
        questList.Add(10, new QuestData("진행중인 퀘스트 없음", new int[] { 1000 }));
        questList.Add(20, new QuestData("탈리아를 구출해라", new int[] { 200, 1000 }));
        questList.Add(30, new QuestData("진행중인 퀘스트 없음", new int[] { 0 }));

    }

    public int GetQuestTalkIndex(int id) // Npc Id를 받아 퀘스트 번호를 반환하는 함수 
    {
        return questId + questActionIndex;
    }

    public string CheckQuest() //오버로딩 
    {
        //return Quest Name
        return questList[questId].questName;
    }


    public string CheckQuest(int id) //npc id
    {
        //해당 퀘스트가 종료 전일 때
        if (id == questList[questId].NpdId[questActionIndex])
        {
            // questList에서 questId에 해당하는 퀘스트에서 , 
            //이 퀘스트에 참여하는 npc의 순서번호(questActionIndex)와 입력받은 npc id가 같은 경우 -> 퀘스트 종료 전
            questActionIndex++;
        }

        //Control Quest Object
        ControlObject();

        //퀘스트가 종료되었을 때
        if (questActionIndex == questList[questId].NpdId.Length)
        {
            //퀘스트 리스트에 있는 NpcId(퀘스트에 참여하는 npc) 수와 같을 때 -> 퀘스트 종료
            NextQuest();
        }

        return questList[questId].questName;
    }

    void NextQuest()
    {
        questId += 10;
        questActionIndex = 0;

    }

    void ControlObject()
    {

        switch (questId)
        {
            case 10:
                if (questActionIndex == 1){
                    itemData.items[3].itemValue=f;
                    Debug.Log("100%로 변경되었습니다");
                }
                    //questObject[0].GetComponent<ItemData>().items[3].isQuestStart = true;
                //Debug.Log(questObject[0].GetComponent<ItemData>().items[3].isQuestStart);
                //    questObject[0].SetActive(true);
                break;

            case 20:
                //if(questActionIndex == 1) //10번 퀘스트를 끝마치면 열쇠 등장 
                //    questObject[0].SetActive(true);    
                //if (questActionIndex == 1) //10번 퀘스트를 끝마치면 열쇠 등장 
                    //questObject[0].SetActive(false);
                if (questActionIndex == 2) //퀘스트를 끝마치면 철창이 사라짐 
                    questObject[0].SetActive(false);
                break;

            case 30:
                if (questActionIndex == 1) //퀘스트를 끝마치면 철창이 사라짐 
                    questObject[0].SetActive(false);
                break;


        }

    }

    //public void CheckQuestId(GameObject gameobj){

    //    if(gameobj.name=="탈리아"){
    //        if(questId!=10) questId=10;
    //        if(questId==20) questId=0;
    //    }

    //}


}

 

GameManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    //Script
    public PlayerMove player;
    public TalkManager talkManager;
    public QuestManager questManager;


    public int Stage;
    public int Level;
    public int exp;
    public int money;
    public int maxEXP;

    //public int money;

    public static GameManager instance;    
    public bool isEnterSaveJone = false;


    //UI Object
    public Text UI_Money_Text;
    public Text UI_Level_Text;
    public Slider HP_BAR;
    public Slider EXP_BAR;

    //퀘스트 버튼
    public GameObject UI_QuestBtn;
    public GameObject UI_QuestIMG;
    public Text UI_QuestText;
    public Text UI_QuestNameText;


    public GameObject UI_inventoryBtn;
    public GameObject UI_SettingBtn;

    //대화창용 
    //대화창 UI 및 변수 
    public GameObject talkPanel;
    public Image portraitImg;
    public Text UINameText;
    public Text UITalkText;
    public Text UIInfoText;
    public GameObject scanObject;
    public bool isAction; //대화창 활성화 상태 

    public int talkIndex;
    public string name;


    //Retry
    public GameObject UIRestartBtn;

    private void Start()
    {
        instance = this;
        Level = 1;
        maxEXP = 100;
    }
    private void Awake()
    {
        
    }

    private void Update()
    {

        //UI  텍스트 
        UI_Level_Text.text = "Lv." + Level;
        //Debug.Log("Level(Update): " + Level);
        UI_Money_Text.text = money.ToString();

        //UI 체력바
        HP_BAR.value = (float)player.hp / (float)player.maxHP;
        EXP_BAR.value = (float)exp / 100;

    }

    public void LevelUp()
    {
        exp = exp - 100;
        Level++;
        UI_Level_Text.text = "Lv." + Level;
    }

    public void GetMoney()
    {
        UI_Money_Text.text = money.ToString();
    }

    public void Action(GameObject scanObj)
    {
        if(scanObj!=null)
        {
        scanObject = scanObj; //player에 scanObject를 GameManager의 scanObject에 넣음
        }
        name = scanObject.name;//이름저장
        //UITalkText.text = "이것은 "+scanObject.name+"이다.";
        ObjData objData = scanObject.GetComponent<ObjData>();
        Talk(objData.id, objData.isNPC);

        

        talkPanel.SetActive(isAction); //대화창 활성화 상태에 따라 대화창 활성화 변경
    }

    //실제 대사들을 UI에 출력하는 함수     
    void Talk(int id, bool isNPC)
    {

        int questTalkIndex = questManager.GetQuestTalkIndex(id); // 조사한 obj의 id를 넘겨 퀘스트 id를 반환받음 

        string talkData = talkManager.GetTalk(id + questTalkIndex, talkIndex); //id에 퀘스트 id를 더하면 -> 해당 id를 가진 오브젝트가 가진 퀘스트의 대화를 반환하게 만들기


        if (talkData == null) //반환된 것이 null이면 더이상 남은 대사가 없으므로 action상태변수를 false로 설정 
        {
            isAction = false;
            //player.scanObject = null;
            //scanObject = null;
            //player.scanObject == null;
            talkIndex = 0; //talk인덱스는 다음에 또 사용되므로 초기화해야함 
            Debug.Log(questManager.CheckQuest(id));
            Text questName = UI_QuestIMG.GetComponentInChildren<Text>();
            questName.text = questManager.CheckQuest(id);
            return; //void에서의 return 함수 강제종료 (밑의 코드는 실행되지 않음)
        }

        if (isNPC)
        {
            UIInfoText.text = "";
            UITalkText.text = talkData.Split(':')[0]; //구분자로 문장을 나눠줌  0: 대사 1:portraitIndex
            portraitImg.sprite = talkManager.GetPortrait(id, int.Parse(talkData.Split(':')[1]));

            if (int.Parse(talkData.Split(':')[1]) == 0)
            {
                UINameText.text = "백설공주";
            }
            else
            {
                UINameText.text = name;
            }

            portraitImg.color = new Color(1, 1, 1, 1);

        }
        else
        {
            UINameText.text = "";
            UITalkText.text = "";
            UIInfoText.text = talkData;

            portraitImg.color = new Color(1, 1, 1, 0);
        }

        //다음 문장을 가져오기 위해 talkData의 인덱스를 늘림
        isAction = true; //대사가 남아있으므로 계속 진행되어야함 
        talkIndex++;
    }

    public void Restart()
    { //재시작이므로 처음부터 다시시작이라 scene 0번 

        //Time.timeScale = 1; //플레이어가 다시 움직일 수 있도록 함 
        SceneManager.LoadScene(0);
    }


    public void QuestButtonStart()
    {

        //Text questName = UI_QuestIMG.GetComponentInChildren<Text>();
        //questName.text = questManager.CheckQuest(id);

        if (UI_QuestIMG.activeSelf == true)
            UI_QuestIMG.SetActive(false);
        else
            UI_QuestIMG.SetActive(true);

    }
}

 

 

 

 

 

 

 

728x90