수정해야할 부분 클릭을 두번해야 색이 변함.

스킬이 중복되게 나오면 안됨

 

 

추가적으로 해야 할 것

유니티를 실행하다 꺼서 다시 시작할 필요 없이

버튼을 클릭 시 스킬이 다시 랜덤으로 생성되게

(이 부분을 계속 시도해보는데 초기화가 안됨)

(RemoveAllListener을 사용해봄)

+ 스킬 2개는 중복이 되면 안된다.

 

 

 

using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.U2D;
using UnityEngine.UI;

public class SkillManager : MonoBehaviour
{
    public static SkillManager instance; //싱글톤

    public SpriteAtlas skillsAtlas;
    public Button levelUpBtn;
    public Button closeBtn;
    public GameObject selectSkillPopUp;
    public SkillData[] skillDatas;
    private int randomSkillIndex;

    private void Awake() //싱글톤
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else if (instance != null)
        {
            Destroy(this.gameObject);
        }
    }

    // 비모노 일때
    //public static SkillManager Instance 
    //{
    //    get
    //    {
    //        if (null == instance)
    //        {
    //            return null;
    //        }
    //        return instance;
    //    }
    //}


    public void Start()
    {
        levelUpBtn.onClick.RemoveAllListeners();
        OnClickLevelUpBtn();
        OnClickCloseBtn();
        TextAsset asset = Resources.Load<TextAsset>("data/skills_data");
        string json = asset.text;

        Debug.Log(json);

        skillDatas = JsonConvert.DeserializeObject<SkillData[]>(json);
        foreach (SkillData data in skillDatas)
        {
            Debug.Log(data.id);
            //문자열 => 객체 (역직렬화) 각 객체를 돌며 id를 잘 찾는지 확인
        }
    }


    public SkillData GetDataById(int id)
    {
        SkillData foundSkillData = null;
        for (int i = 0; i < skillDatas.Length; i++)
        {
            SkillData skillData = this.skillDatas[i];
            if (skillData.id == id)
            {
                foundSkillData = skillData;
                break;
            }
        }
        return foundSkillData;
    }

    public int GetRandomAtlasImgId()
    {
        int id = skillDatas[randomSkillIndex].id;
        return id;
    }

    public string GetRandomAtlasName()
    {
        string name = skillDatas[randomSkillIndex].name;
        return name;
    }

    public string GetRandomAtlasDesc()
    {
        string desc = skillDatas[randomSkillIndex].desc;
        return desc;
    }


    public Sprite GetRandomAtlasImg()
    {
        //랜덤으로 얻은 배열인 인덱스의 이미지 이름
        Sprite skillSprite = skillsAtlas.GetSprite(skillDatas[randomSkillIndex].name);
        return skillSprite;
    }

    public void GetSkillsRandomNum()
    {
        randomSkillIndex = Random.Range(0, skillDatas.Length);
        //스킬데이터의 인덱스번호로 랜덤하게 출력
        //Debug.Log(randomSkillIndex); 


    }

    public void OnClickLevelUpBtn()
    {
        levelUpBtn.onClick.AddListener(() =>
            {
                selectSkillPopUp.SetActive(true);

                GetSkillsRandomNum();

                GetRandomAtlasImg();
                GetRandomAtlasName();
                GetRandomAtlasDesc();
            });
    }



    public void OnClickCloseBtn()
    {
        closeBtn.onClick.AddListener(() =>
        {
            selectSkillPopUp.SetActive(false);
        });
    }





}

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
public class SelectSkillPopUp : MonoBehaviour
{
    public Image skillImg1;
    public TMP_Text skillId1;
    public TMP_Text skillName1;
    public TMP_Text skillDesc1;


    public Image skillImg2;
    public TMP_Text skillId2;
    public TMP_Text skillName2;
    public TMP_Text skillDesc2;


    public Button shuffleSkills;


   
    void Start()
    {

        shuffleSkills.onClick.AddListener(() =>
        {
            Debug.Log("클릭");

            SkillManager.instance.OnClickLevelUpBtn();
        });
        ////skillId1.text = SkillManager.instance.GetDataById(105).id.ToString();
        ////skillId2.text = SkillManager.instance.GetDataById(104).id.ToString();

        //skillImg1.sprite = SkillManager.instance.GetRandomAtlasImg();
        //skillImg2.sprite = SkillManager.instance.GetRandomAtlasImg();
        ////skillId1.text = SkillManager.instance.GetDataById().id.ToString();
        //skillId1.text = SkillManager.instance.GetRandomAtlasImgId().ToString();
        //skillId2.text = SkillManager.instance.GetRandomAtlasImgId().ToString();



        skillImg1.sprite = SkillManager.instance.GetRandomAtlasImg();
        skillId1.text = SkillManager.instance.GetRandomAtlasImgId().ToString();
        skillName1.text = SkillManager.instance.GetRandomAtlasName().ToString();
        skillDesc1.text = SkillManager.instance.GetRandomAtlasDesc().ToString();


        SkillManager.instance.GetSkillsRandomNum();

        
        skillImg2.sprite = SkillManager.instance.GetRandomAtlasImg();
        skillId2.text = SkillManager.instance.GetRandomAtlasImgId().ToString();
        skillName2.text = SkillManager.instance.GetRandomAtlasName().ToString();
        skillDesc2.text = SkillManager.instance.GetRandomAtlasDesc().ToString();
    }

}

아래의 api document를 활용하여 각각의 프로티에 대한 정보를 얻을 수 있다.

 

 

https://docs.unity3d.com/ScriptReference/RenderSettings.html

 

Unity - Scripting API: RenderSettings

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

 

 

아래의 사진은 ambientLight라는 속성의 예시이다.

'Study > ' 카테고리의 다른 글

[Tip] Mathf.DeltaAngle  (0) 2024.06.29
[Tip] Object.FindObjectOfType  (0) 2024.06.11
[팁] Slider.onValueChanged  (0) 2024.06.05
[Tip] 3D 프로젝트에서 SpriteAtals 패킹하는 법  (0) 2024.05.23
[Tip] 패키지에서 프리팹찾기  (0) 2024.04.18

https://docs.unity3d.com/560/Documentation/ScriptReference/UI.Slider-onValueChanged.html

 

Unity - Scripting API: UI.Slider.onValueChanged

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

 

'Study > ' 카테고리의 다른 글

[Tip] Object.FindObjectOfType  (0) 2024.06.11
[Tip] RenderSettings  (0) 2024.06.05
[Tip] 3D 프로젝트에서 SpriteAtals 패킹하는 법  (0) 2024.05.23
[Tip] 패키지에서 프리팹찾기  (0) 2024.04.18
[Tip] CameraShaker  (0) 2024.03.29

제이슨의 데이터를 가져오는 것은 성공하고

UI를 만들었으나 TMP_Text에 아이디를 가져오는 와중에

Null이 나왔는데 어찌저찌 만지다 보니 해결은 되었지만,

개운하지 않은 이 찝찝한 기분..

 

using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;

public class SkillManager : MonoBehaviour
{
    public static SkillManager instance; //싱글톤
    public Button levelUpBtn;
    public Button closeBtn;
    public GameObject selectSkillPopUp;
    public SkillData[] skillDatas;
    private void Awake() //싱글톤
    {
        if(instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }else if(instance != null)
        {
            Destroy(this.gameObject);
        }
    }

    //public static SkillManager Instance
    //{
    //    get
    //    {
    //        if (null == instance)
    //        {
    //            return null;
    //        }
    //        return instance;
    //    }
    //}


    public void Start()
    {
        OnClickLevelUpBtn();
        OnClickCloseBtn();
        TextAsset asset = Resources.Load<TextAsset>("data/skills_data");
        string json = asset.text;

        Debug.Log(json);

        skillDatas = JsonConvert.DeserializeObject<SkillData[]>(json);
        foreach (SkillData data in skillDatas)
        {
            Debug.Log(data.id);
            //문자열 => 객체 (역직렬화) 각 객체를 돌며 id를 잘 찾는지 확인
        }
    }


    public SkillData GetDataById(int id)
    {
        SkillData foundSkillData = null;
        for(int i = 0; i < skillDatas.Length; i++)
        {
            SkillData skillData = this.skillDatas[i];
            if(skillData.id == id)
            {
                foundSkillData = skillData;
                break;
            }
        }
        return foundSkillData;
    }


    public void OnClickLevelUpBtn()
    {
        levelUpBtn.onClick.AddListener(() =>
        {
            selectSkillPopUp.SetActive(true);
        });

    }


    public void OnClickCloseBtn()
    {
        closeBtn.onClick.AddListener(() =>
        {
            selectSkillPopUp.SetActive(false);
        });
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SkillData
{
    public int id;
    public string name;
    public string sprite_name;
    public string desc;
}

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class SelectSkillPopUp : MonoBehaviour
{
    public TMP_Text skillId;
    void Start()
    {
        skillId.text = SkillManager.instance.GetDataById(103).id.ToString();
    }

}

using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using System.Dynamic;
using Unity.VisualScripting;
using Unity.VisualScripting.Antlr3.Runtime.Tree;
using UnityEngine;
using UnityEngine.U2D;
using UnityEngine.UI;

public class Main : MonoBehaviour
{
    private Main() { }
    private static Main instance;
    public static Main Instance
    {
        get
        {
            // 인스턴스가 null인 경우 새로 생성
            if (instance == null)
            {
                instance = new Main();
                // 기존의 Start 메서드 내용을 Init 메서드로 옮김
                instance.Init();
            }
            return instance;
        }
    }

    public SpriteAtlas equipmentAtlas;
    [SerializeField] private Image weapon;
    [SerializeField] private Image armor;
    [SerializeField] private Image helmet;
    [SerializeField] private Image shield;
    [SerializeField] private Image accessaries;

    public EquipmentData[] equipmentDatas;
    private int id;

    void Init()
    {
        TextAsset asset = Resources.Load<TextAsset>("data/equipment_data");
        string json = asset.text;
        //Debug.Log(json);

        //현재 문자열을 객체로 역직렬화
        equipmentDatas = JsonConvert.DeserializeObject < EquipmentData[] >(json);

        EquipmentData foundData = this.GetDataById(1002);
        //foreach (EquipmentData equipment in equipmentDatas)
        //{
        //JSON 데이터에서 해당 필드가 비어있거나 값이 없다면, 해당 필드는 역직렬화될 때 0으로 초기화
        //Debug.LogFormat("{0}, {1}, {2}, {3}, {4}", equipment.id, equipment.name, equipment.type, equipment.damage, equipment.defense);
        //}
        Debug.LogFormat("{0}, {1}, {2}, {3}", foundData.id, foundData.name, foundData.type, foundData.defense);

    }

    public EquipmentData GetDataById(int id)
    {
        EquipmentData foundData = null;
        this.id = id;
        for(int i = 0; i < this.equipmentDatas.Length; i++)
        {
            EquipmentData equipmentData = this.equipmentDatas[i];
            if(equipmentData.id == id)
            {
                foundData = equipmentData;
                break;
            }
        }
        return foundData;
    }

    public Sprite GetSpriteImg(string imgName)
    {
        EquipmentData equipmentData = null;
        foreach (var data in equipmentDatas)
        {
            if (data.name == imgName)
            {
                equipmentData = data;
                break;
            }
        }

        if (equipmentData != null)
        {
            string imagePath = "img/" + equipmentData.name;
            Sprite sprite = Resources.Load<Sprite>(imagePath);
            return sprite;
        }
        else
        {
            Debug.LogError("Equipment data with name " + imgName + " not found.");
            return null;
        }
    }

    public void LoadAndSetImage(Image imageComponent, string imgName)
    {
        Sprite sprite = GetSpriteImg(imgName);
        if (sprite != null)
        {
            imageComponent.sprite = sprite;
        }
    }

}

 

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

public class Weapon : MonoBehaviour
{
    public TMP_Text idText;
    public Image weaponImg;
    private void Start()
    {
        //Sprite weaponSprite = Main.Instance.equipmentAtlas.GetSprite("weaponA");
        //weaponImg.sprite = weaponSprite;

        //Sprite sprite = Resources.Load<Sprite>("img/weaponA");
        //weaponImg.sprite = sprite;

        Main.Instance.LoadAndSetImage(weaponImg, "weaponA");

        //weaponImg = 
        idText.text = Main.Instance.GetDataById(1000).id.ToString();
    }
}

 

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


public class Shield : MonoBehaviour
{
    public TMP_Text idText;
    public Image shieldImg;

    private void Start()
    {
        Main.Instance.LoadAndSetImage(shieldImg, "shieldA");
        idText.text = Main.Instance.GetDataById(1001).id.ToString();
    }
}

 

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


public class Armor : MonoBehaviour
{
    public TMP_Text idText;
    public Image armorImg;


    private void Start()
    {
        Main.Instance.LoadAndSetImage(armorImg, "armorA");
        idText.text = Main.Instance.GetDataById(1003).id.ToString();
    }

}

 

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

public class Accessaries : MonoBehaviour
{
    public TMP_Text idText;
    public Image accessoryImg;

    private void Start()
    {
        Main.Instance.LoadAndSetImage(accessoryImg, "accessoryA");
        idText.text = Main.Instance.GetDataById(1004).id.ToString();
    }
}

 

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class Helmet : MonoBehaviour
{
    public TMP_Text idText;
    public Image helmetImg;
    private void Start()
    {
        Main.Instance.LoadAndSetImage(helmetImg, "helmetA");
        idText.text = Main.Instance.GetDataById(1002).id.ToString();
    }
}

 

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

public class EquipmentData
{
    public int id;
    public string name;
    public string type;
    public int damage;
    public int defense;
}

상속?

캡슐화 및 다형성과 함께 객체 지향 프로그래밍의

세가지 주요 특성 중 하나

다른 클래스에 정의된 동작을 재사용, 확장 및 수정하는 새 클래스를 만들 수 있다.

 

사용하는 이유?

코드 기능을 재사용, 구현 시간 단축

 

맴버가 상속되는 클래스를 기본 클래스

해당 맴버를 참조하는 클래스를 파생클래스

https://www.youtube.com/watch?v=SiAyDvab-wc&list=PLTFRwWXfOIYBmr3fK17E0VhKPyYrGy75z&index=37

 

 

단 , 부모가 둘일 수는 없다.

 

새 클래스를 만들 때 기존 클래스의 필드와 메서드를 재사용

 

=> 더 쉽게 만들고 유지 관리할 수 있다

 

 

protected 접근제어자를 사용하는 주된 이유는,

 

해당 클래스나 상속받은 다른 클래스에서만 생성자를 호출할 수 있게 제한함으로써,

의도치 않은 인스턴스 생성을 방지하고 객체의 일관성을 유지하기 위해서

 

 

 

 

상속을 받았다면 부모 클래스의 생성자도 호출됨

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Step37
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Marine marineA = new Marine();
            marineA.Init("마린 A", 10);
            marineA.damage = 2;

            Marine marineB = new Marine();
            marineB.Init("마린 B", 10);
            marineB.damage = 2;

            Medic medic = new Medic();
            medic.healValue = 3;

            marineB.Attack(marineA);

            Console.WriteLine("마린 A의 체력 : {0}",marineA.GetHp());
            Console.WriteLine("마린 B의 체력 : {0}",marineB.GetHp());

            medic.Heal(marineA);

            Console.WriteLine("마린 A의 체력 : {0}", marineA.GetHp());
            Console.WriteLine("마린 B의 체력 : {0}", marineB.GetHp());
        }
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Step37
{
    internal class TerranUnit : StarcraftUnit
    {
        protected int hp;
        protected int maxHp;

        public TerranUnit()
        {
            Console.WriteLine("TerranUnit 클래스 생성자");
        }

        public void Init(string name, int maxHp)
        {
            this.name = name;
            this.maxHp = maxHp;
            this.hp = this.maxHp;
        }

        public void Hit(int damage)
        {
            this.hp -= damage;
            Console.WriteLine("{0}이 피해{1}를 받았습니다", this.name, damage);
        }

        public int GetHp()
        {
            return this.hp;
        }

        public void AddHp(int heal)
        {
            this.hp += heal;

            Console.WriteLine("{0}의 체력이 회복 되었습니다", this.name);

            if(this.hp >= this.maxHp)
            {
                this.hp = this.maxHp;
            }
        }
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Step37
{
    internal class StarcraftUnit
    {
        public string name;
        //생성자
        public StarcraftUnit()
        {
            Console.WriteLine("StarcraftUnit 생성자");
        }
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Step37
{
    internal class Marine : TerranUnit
    {
        public int damage;
        public Marine()
        {
            Console.WriteLine("Marine 클래스 생성자");

        }

        public void Attack(TerranUnit target)
        {
            target.Hit(this.damage);
        }

    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Step37
{
    internal class Medic : TerranUnit
    {
        public int healValue;
        public Medic()
        {
            Console.WriteLine("Medic 클래스 생성자");
        }

        public void Heal(TerranUnit target)
        {
            target.AddHp(this.healValue);
        }
    }
}

 

'Study > C#' 카테고리의 다른 글

[C#] 생성자 연결  (0) 2024.06.12
[C#] virtual, override  (0) 2024.06.12
[C#] static 한정자  (0) 2024.06.02
[C#] this 키워드  (0) 2024.05.31
[C#] 점연산자 NullReferenceException  (0) 2024.05.30

메서드 오버로딩?

다형성을 구현하는 방법중 하나

즉, 하나 이상의 형태를 취할 수 있는 능력

https://www.youtube.com/watch?v=UQmok_QRSKY&list=PLTFRwWXfOIYBmr3fK17E0VhKPyYrGy75z&index=36

 

 

메서드 오버로딩은

동일한 이름을 가진 여러 메서드를 정의하는 것

 

메서드 오버로딩을 사용하는 때

 

1. 매개변수의 수 변경

2. 다른 타입의 매개변수 사용

3. 서로 다른 타입의 매개변수 순서 변경

 

 

 

생성자 오버로딩

 

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Step36
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //Calculator calc = new Calculator();
            //int result = calc.Add(1, 2);
            //Console.WriteLine(result);

            //result = calc.Add(1, 2, 3);
            //Console.WriteLine(result);

            //calc.Subtract(1.3f, 1.5f);
            //calc.Subtract(5, 1.5f);
            //calc.Subtract(10f, 5);

            //calc.Multiple(1.5f, 2);
            //calc.Multiple(2, 1.5f);
            
            //생성자 오버로딩
            Hero hong = new Hero();
            Hero lim = new Hero("임꺽정");
            Hero jang = new Hero("장길산", 3, 10);
            
        }
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Step36
{
    internal class Calculator
    {
        //클래스가 생성되면 기본 생성자를 만들자

        public Calculator()
        {

        }

        //메서드 오버로딩
        public int Add(int a, int b)
        {
            int result = a + b;
            return result;
        }
        //다른 매개변수의 수
        public int Add(int a, int b, int c)
        {
            int result = a + b + c;
            return result;
        }

        public int Subtract(int a, int b)
        {
            int result = a - b;
            return result;
        }
        //다른 타입의 매개변수
        public int Subtract(float a, float b)
        {
            int result = Convert.ToInt32(a - b);
            return result;
        }

        public int Subtract(int a, float b)
        {
            int result = a - (int)b;
            return result;
        }
        //서로다른 매개변수의 순서 변경
        public int Multiple(int a, float b)
        {
            int result = a * (int)b;
            return result;
        }

        public int Multiple(float a, int b)
        {
            int result = (int)a * b;
            return result;
        }
        
        //반환타입이 다른것은 오버로딩 불가능

    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Step36
{
    internal class Hero
    {
        //생성자
        public Hero()
        {
            Console.WriteLine("매개변수가 없는 기본 생성자");
        }

        //생성자 오버로딩
        public Hero(string anme)
        {
            Console.WriteLine("매개변수가 1개 있는 생성자");

        }

        //생성자 오버로딩
        public Hero(string name, int damage, int maxHp)
        {
            Console.WriteLine("매개변수가 3개 있는 생성자");

        }
    }
}

'낙서장 > C#' 카테고리의 다른 글

virtual ,override, base  (2) 2024.03.08
상속과 다형성  (1) 2024.03.08
흐름 제어  (1) 2024.02.26
데이터를 가공하는 연산자  (0) 2024.02.25
데이터를 담는 변수와 상수  (0) 2024.02.22

+ Recent posts