using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.U2D;
public class AtlasManager : MonoBehaviour
{
public static AtlasManager instance;
public SpriteAtlas blockAtlas;
//싱글톤
private void Awake()
{
//AtlasManager 클래스의 인스턴스를 instance에 할당
instance = this;
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.U2D;
using Random = UnityEngine.Random;
public class Test : MonoBehaviour
{
public Board board;
private void Start()
{
board.CreateBoard();
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Debug.DrawRay(ray.origin, ray.direction * 100f, Color.red, 1);
RaycastHit2D raycastHit2D = Physics2D.Raycast(ray.origin, ray.direction);
if (raycastHit2D.collider != null)
{
Block block = raycastHit2D.collider.GetComponent<Block>();
Debug.Log($"[{block.row}, {block.col}] ({block.transform.position.x}, {block.transform.position.y}), {block.blockType}");
}
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using Random = UnityEngine.Random;
public class Board : MonoBehaviour
{
private Block[,] board; //1차원 배열이 Block들을 관리
public GameObject blockPrefab;
public void CreateBoard()
{
//크기가 9인 BlockType의 1차원 배열 만들기
board = new Block[5, 9]; // 2차원 배열로 변경
//5행 9열의 Block타입의 2차원 배열 만들기
for (int i = 0; i < board.GetLength(0); i++)
{
for (int j = 0; j < board.GetLength(1); j++)
{
CreateBlock(i, j);
}
}
PrintBoard();
}
public void CreateBlock(int row, int col)
{
Vector2 pos = new Vector2(col, row);
Block.BlockType blockType = (Block.BlockType)Random.Range(0, 5);
GameObject blockGo = Instantiate(blockPrefab);
Block block = blockGo.GetComponent<Block>();
block.Init(blockType);
block.SetPosition(pos);
//배열의 요소에 블록 넣기
board[row, col] = block;
}
public void PrintBoard()
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < board.GetLength(0); i++)
{
for (int j = 0; j < board.GetLength(1); j++)
{
sb.Append($"({i},{j})"); // StringBuilder에 문자열 추가
}
sb.AppendLine(); // 새로운 행 추가
}
Debug.Log(sb); // StringBuilder에 저장된 문자열을 출력
}
}
using System.Collections;
using System.Collections.Generic;
using TMPro;
using Unity.Mathematics;
using UnityEngine;
public class Block : MonoBehaviour
{
public enum BlockType
{
Blue, Gray, Green, Pink, Yellow
}
public BlockType blockType;
public SpriteRenderer spriteRenderer;
public TMP_Text debugText;
public int row;
public int col;
public void Init(BlockType blockType)
{
this.blockType = blockType;
//이미지 변경
ChangeSprite(blockType);
}
public void ChangeSprite(BlockType blockType)
{
//블록의 이름을 넣어서 아틀라스에서 같은 이름인 sprite를 찾고 할당
Sprite sp =
AtlasManager.instance.blockAtlas.GetSprite(blockType.ToString());
spriteRenderer.sprite = sp;
}
public void SetPosition(Vector2 pos)
{
transform.position = pos;
var index = Position2Index(pos);
row = index.row;
col = index.col;
debugText.text = $"[{index.row}, {index.col}]";
}
public static (int row, int col) Position2Index(Vector2 pos)
{
return ((int)pos.y, (int)pos.x);
}
public static (int x, int y) Index2Position(Vector2 index)
{
return ((int)index.x, (int)index.y);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Stet39
{
internal class Program
{
static void Main(string[] args)
{
//Position pos = new Position(1,1);
//Position pos = new Position();
//Position pos;
//pos.x = 1;
//pos.y = 1;
//Console.WriteLine(pos);
//Position pos = new Position(1,1);
//pos.SetOrigin();
//Console.WriteLine("{0}, {1}", pos.x, pos.y);
Marine marine = new Marine(new Position(1,1));
Console.WriteLine("마린의 현재 위치 : {0}, {1}", marine.position.x, marine.position.y); ;
marine.Move(new Position(2, 3));
Position pos = marine.GetPostion();
Console.WriteLine("마린의 현재 위치 : {0}, {1}", pos.x, pos.y);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Stet39
{
struct Position
{
public int x;
public int y;
public Position(int x, int y)//매개 변수 없는 생성자 사용불가
{
this.x = x;
this.y = y;
}
public void SetOrigin()
{
this.x = 0;
this.y = 0;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Stet39
{
internal class Marine
{
public Position position;
public Marine(Position position)
{
this.position = position;
}
public void Move(Position targetPosition)
{
Console.WriteLine("{0}, {1}로 이동합니다", targetPosition.x, targetPosition.y);
this.position = targetPosition;
}
public Position GetPostion()
{
return this.position;
}
}
}
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step38
{
internal class Program
{
static void Main(string[] args)
{
//Marine marine = new Marine();
//marine.Attack();
//marine.StimPack();
//업캐스팅(암시적)
//TerranUnit unit = new Marine();
//unit.Attack();
//unit.StimPack(); //호출 불가
//업캐스팅 (명시적)
//TerranUnit unit = (TerranUnit)new TerranUnit();
//unit.Attack();
//unit.StimPack(); //호출불가
//TerranUnit unit = new Marine(); //암시적 업캐스팅
//Marine marine = (Marine)unit; //다운 캐스팅은 명시적이어야함
//marine변수의 값은 Marine의 인스턴스
//marine.Attack();
//marine.StimPack(); //호출 가능
/*주의 사항*/
//부모 클래스 인스턴스 생성 후
//자식 클래스 타입으로 (다운캐스팅) 할수 없다.
//Marine marine = (Marine)new TerranUnit();
//marine.Attack();
//marine.StimPack(); //호출가능
//is 연산자를 사용해서
//형식 변환이 가능한지 테스트 가능
//TerranUnit unit = new TerranUnit();
//bool canDownCast = unit is Marine;
//Console.WriteLine(canDownCast); //False
//Marine marine = new Marine();
//bool canUpCast = marine is TerranUnit;
//Console.WriteLine(canUpCast); // True
//TerranUnit unit = marine; //암시적 업캐스팅
//TerranUnit unit = new Marine(); //암시적 업캐스팅
//bool canUpCast = unit is TerranUnit;
//Console.WriteLine(canUpCast); //True
//Marine marine = (Marine)unit; //명시적 다운캐스팅
//as 연산자를 사용해 명시적으로 캐스팅 하기
//Marine marine = new Marine();
//TerranUnit unit = marine as TerranUnit;
//Console.WriteLine(unit); //Step38.Marine => 성공
TerranUnit unit = new TerranUnit();
Marine marine = unit as Marine;
Console.WriteLine("marine : {0}", marine); //marine : => 변환이 실패하면 결과값은 null
//즉, 예외를 발생시키지 않는다.
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step38
{
internal class TerranUnit
{
public void Attack()
{
Console.WriteLine("공격합니다.");
}
//public TerranUnit() { }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step38
{
internal class Marine : TerranUnit
{
public void StimPack()
{
Console.WriteLine("스팀팩을 활성화합니다.");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
namespace Step37_3
{
internal class Program
{
static void Main(string[] args)
{
//new Marine();
new Marine("홍길동");
//new Marine("홍길동", 8);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step37_3
{
internal class TerranUnit
{
protected string name;
protected int damage;
public TerranUnit()
{
Console.WriteLine("TerranUnit의 생성자");
}
public TerranUnit(string name) : this(name, 0)
{
this.name = name;
Console.WriteLine("매개변수가 1개있는 생성자");
}
public TerranUnit(string name, int damage)
{
this.name = name;
this.damage = damage;
Console.Write("매개 변수가 2개 있는 TerranUnit 생성자");
}
}
}
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step37_3
{
internal class Marine : TerranUnit
{
public Marine() : base() //없으면 암시적으로 동작
{
Console.WriteLine("Marine 생성자");
}
public Marine(string name) : base(name) //매개변수 이름을 동일하게
{
Console.WriteLine("매개변수 1개 있는 Marine 생성자, name : {0} : ", this.name);
}
public Marine(string name, int damage) : base(name, damage)
{
Console.WriteLine("매개변수 2개 있는 Marine 생성자, name : {0}, damage : {1}", this.name, this.damage);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step37_2
{
internal class Program
{
static void Main(string[] args)
{
Marine marine = new Marine();
marine.name = "마린1";
Firebat firebat = new Firebat();
firebat.name = "파이어뱃1";
marine.Attack();
firebat.Attack();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step37_2
{
class TerranUnit
{
public string name;
//생성자
public TerranUnit()
{
Console.WriteLine("TerranUnit 클래스의 생성자");
}
public virtual void Attack()
{
Console.WriteLine("{0}이(가) 공격 합니다", this.name);
}
protected void Reload(string weaponName) //자식만 접근 가능
{
Console.WriteLine("{0}이(가) {1}을 장전을 합니다", this.name, weaponName); ;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step37_2
{
internal class Marine : TerranUnit
{
//생성자
public Marine()
{
Console.WriteLine("Marine클래스의 생성자");
}
public override void Attack()
{
base.Reload("총");
Console.WriteLine("{0}이(가) 총으로 공격합니다.", this.name);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace Step37_2
{
internal class Firebat : TerranUnit
{
public Firebat()
{
Console.WriteLine("Firebat클래스의 생성자");
}
public override void Attack()
{
base.Reload("화염방사기");
Console.WriteLine("{0}이(가) 화염방사기로 공격합니다.", this.name);
}
}
}
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
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 List<int> rememberRandomIndex = new List<int>();
private void Awake() // 싱글톤
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else if (instance != this)
{
Destroy(gameObject);
}
}
public void Start()
{
levelUpBtn.onClick.RemoveAllListeners();
OnClickLevelUpBtn();
OnClickCloseBtn();
TextAsset asset = Resources.Load<TextAsset>("data/skills_data");
string json = asset.text;
skillDatas = JsonConvert.DeserializeObject<SkillData[]>(json);
}
public SkillData GetDataById(int id)
{
SkillData foundSkillData = null;
foreach (SkillData skillData in skillDatas)
{
if (skillData.id == id)
{
foundSkillData = skillData;
break;
}
}
return foundSkillData;
}
public int GetRandomAtlasImgId(int randomIndex)
{
return skillDatas[randomIndex].id;
}
public string GetRandomAtlasName(int randomIndex)
{
return skillDatas[randomIndex].name;
}
public string GetRandomAtlasDesc(int randomIndex)
{
return skillDatas[randomIndex].desc;
}
public Sprite GetRandomAtlasImg(int randomIndex)
{
return skillsAtlas.GetSprite(skillDatas[randomIndex].name);
}
public int GetSkillsRandomNum()
{
int randomIndex;
do
{
randomIndex = Random.Range(0, skillDatas.Length);
} while (rememberRandomIndex.Contains(randomIndex));
rememberRandomIndex.Add(randomIndex);
Debug.Log("랜덤으로 선택된 스킬 인덱스: " + randomIndex);
return randomIndex;
}
public void OnClickLevelUpBtn()
{
levelUpBtn.onClick.AddListener(() =>
{
selectSkillPopUp.SetActive(true);
int randomIndex = GetSkillsRandomNum();
GetRandomAtlasImg(randomIndex);
GetRandomAtlasName(randomIndex);
GetRandomAtlasDesc(randomIndex);
});
}
public void OnClickCloseBtn()
{
closeBtn.onClick.AddListener(() =>
{
selectSkillPopUp.SetActive(false);
});
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
using UnityEngine.U2D;
using UnityEditor;
using Newtonsoft.Json;
public class SelectSkillPopUp : MonoBehaviour
{
public GameObject[] selectSkills;
public Image[] skillImgs;
public TMP_Text[] skillIds;
public TMP_Text[] skillNames;
public TMP_Text[] skillDescs;
public Button shuffleSkills;
public Button selectBtn;
public SpriteAtlas skillsAtlas;
List<SkillData> skillList = new List<SkillData>();
private int selectedCount = 0;
private List<int> selectedIndexes = new List<int>();
private List<SkillInfo> selectedSkillInfos = new List<SkillInfo>(); // 스킬 정보를 담을 리스트
public void Start()
{
selectBtn.gameObject.SetActive(false);
ShowLevelUp();
foreach (var data in SkillManager.instance.skillDatas)
{
skillList.Add(data);
}
shuffleSkills.onClick.AddListener(ShuffleSkills);
// Add click event to each skill object
for (int i = 0; i < selectSkills.Length; i++)
{
int index = i;
selectSkills[i].GetComponent<Button>().onClick.AddListener(() =>
{
ToggleSkill(index);
});
}
// Select 버튼의 클릭 이벤트 추가
selectBtn.onClick.AddListener(SaveSelectedSkillData);
}
public void ShowLevelUp()
{
selectedIndexes.Clear();
for (int i = 0; i < skillImgs.Length; i++)
{
int randomIndex = SkillManager.instance.GetSkillsRandomNum();
selectedIndexes.Add(randomIndex);
skillImgs[i].sprite = SkillManager.instance.GetRandomAtlasImg(randomIndex);
skillIds[i].text = SkillManager.instance.GetRandomAtlasImgId(randomIndex).ToString();
skillNames[i].text = SkillManager.instance.GetRandomAtlasName(randomIndex);
skillDescs[i].text = SkillManager.instance.GetRandomAtlasDesc(randomIndex);
}
}
public void ShuffleSkills()
{
selectedCount = 0;
for (int i = 0; i < skillImgs.Length; i++)
{
int randomIndex = GetUniqueRandomIndex();
selectedIndexes[i] = randomIndex;
skillIds[i].text = SkillManager.instance.GetRandomAtlasImgId(randomIndex).ToString();
skillNames[i].text = SkillManager.instance.GetRandomAtlasName(randomIndex);
skillDescs[i].text = SkillManager.instance.GetRandomAtlasDesc(randomIndex);
skillImgs[i].sprite = SkillManager.instance.GetRandomAtlasImg(randomIndex);
SetImageAlpha(skillImgs[i], 1f); // Reset alpha value
}
UpdateSelectBtn();
}
int GetUniqueRandomIndex()
{
int randomIndex;
do
{
randomIndex = Random.Range(0, skillList.Count);
} while (selectedIndexes.Contains(randomIndex));
return randomIndex;
}
void SetImageAlpha(Image image, float alpha)
{
Color color = image.color;
color.a = alpha;
image.color = color;
}
void UpdateSelectBtn()
{
selectBtn.gameObject.SetActive(selectedCount == 2);
}
public void ToggleSkill(int index)
{
Image skillImage = skillImgs[index].GetComponent<Image>();
float alpha = GetImageAlpha(skillImage);
if (alpha == 1f)
{
// Select the skill
if (selectedCount < 2)
{
SetImageAlpha(skillImage, 65f / 255f);
selectedCount++;
// 클릭된 스킬의 정보를 SkillInfo 객체에 담고 리스트에 추가
SkillData selectedSkill = skillList[selectedIndexes[index]];
SkillInfo skillInfo = new SkillInfo(selectedSkill.id, selectedSkill.name, selectedSkill.sprite_name, selectedSkill.desc);
selectedSkillInfos.Add(skillInfo);
}
}
else
{
// Deselect the skill
SetImageAlpha(skillImage, 1f);
selectedCount--;
// 해당 스킬을 리스트에서 제거
SkillData selectedSkill = skillList[selectedIndexes[index]];
selectedSkillInfos.RemoveAll(skillInfo => skillInfo.id == selectedSkill.id);
}
UpdateSelectBtn();
}
float GetImageAlpha(Image image)
{
return image.color.a;
}
public void SaveSelectedSkillData()
{
// 선택된 스킬의 정보를 직렬화하여 로컬에 저장
string json = JsonConvert.SerializeObject(selectedSkillInfos);
// 저장할 경로를 지정하고 파일에 쓰기
string filePath = Application.persistentDataPath + "/selected_skills.json";
System.IO.File.WriteAllText(filePath, json);
Debug.Log("Selected skill data saved to: " + filePath);
}
public List<SkillInfo> GetSelectedSkillInfos()
{
return selectedSkillInfos;
}
}
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;
public class SkillInfo
{
public int id;
public string name;
public string sprite_name;
public string desc;
public SkillInfo(int id, string name, string sprite_name, string desc)
{
this.id = id;
this.name = name;
this.sprite_name = sprite_name;
this.desc = desc;
}
}