분류 전체보기 32

[유니티/C#] 라인렌더러를 이용한 움직이는 발판

유니티 내장 기능을 이용하여 플레이어가 올라타면 위아래로 흔들리며 움직이는 발판을 구현한다. 사용한 컴포넌트 1. LineRenderer 2. SpringJoint 발판이 될 오브젝트에 LineRenderer와 SpringJoint를 부착한다. LineRenderer에는 벽에 걸려있는 것처럼 보이는 역할을 하는 오브젝트를 부착한다. SpringJoint는 적절하게 조정한다. 전체 코드 public class Draw_MoveLine : MonoBehaviour { [Header("라인을 그리는 스크립트")] [SerializeField] private Draw_CollisionLine m_drawLine; [Header("라인의 움직일 축이되는 오브젝트")] [SerializeField] private ..

[유니티/C#] UI 슬라이드 기능 만들기 (DOTween)

유니티 내장기능인 DOTween을 사용하여 탭키를 누르면 옆에서 스르륵 등장하는 UI를 간단하게 구현했다. void Update() { if (Input.GetKeyDown(KeyCode.Tab) && isCanTab) { QuestOn(0.3f); } if (Input.GetKeyUp(KeyCode.Tab) && isCanTab) { QuestOff(0.3f); } } public void QuestOn(float duration) { questUI.GetComponent().DOAnchorPosX(0f, duration); } public void QuestOff(float duration) { questUI.GetComponent().DOAnchorPosX(-500f, duration); }

[유니티/C#] 퀘스트 시스템 만들기

이번에 만든것은 퀘스트 시스템이다. 이전에 구조를 잡아놓았던 DataClasses를 활용해 만들었다. 이전글 https://jinsso.tistory.com/10 [유니티/C#] 데이터를 관리하는 클래스 만들기 이전에 데이터를 csv에서 읽어와 저장하는 코드를 작성했었다. 하지만 기능 구현에 중점을 두고 코드를 짜다보니 보기에도, 사용하기에도 별로고 유지보수에도 별로 좋지 못했다. 이번에는 csv로 jinsso.tistory.com 이전의 스킬 시스템 구축 요청을 받았을 때의 경험이 있어서 이번에는 비교적 쉽게 만들 수 있었다. 정리를 하면 1) 1단계 퀘스트 3개를 랜덤으로 가져온다 2) 가져올 때 이전에 가져온 항목과 QuestID가 동일하면 다시 뽑는다 3) 3개가 확정이 되었다면 UI에 적용한다 ..

[유니티/C#] 데이터를 관리하는 클래스 만들기

이전에 데이터를 csv에서 읽어와 저장하는 코드를 작성했었다. 하지만 기능 구현에 중점을 두고 코드를 짜다보니 보기에도, 사용하기에도 별로고 유지보수에도 별로 좋지 못했다. 이번에는 csv로 불러온 데이터들을 관리하는 클래스를 만들었다. 이전에 만들어 둔 코드들을 해당 클래스로 옮김으로써 재사용성과 유지보수성을 높이고자 했다. 우선 데이터를 총괄하는 "DataClasses" 클래스를 만든다. public class DataClasses { // 데이터를 저장할 클래스들의 리스트 생성 public List PassiveSkillData = new List(); public List Quest_NormalData = new List(); // 데이터에 이미지 경로가 지정되어 있다면, 경로상의 이미지를 불러와..

[유니티/C#] 클래스에서 원하는 조건의 랜덤 항목 뽑아오기

팀의 기획자가 "랜덤으로 스킬을 3가지 뽑아달라" 고 요청했다. 이런 흐름으로, 원하는 조건에 맞는 스킬을 뽑아올 수 있어야 했다. 이전에 작성한 글에서 csv파일을 읽어와 Skill 클래스에 저장했으니, 저장한 Skill들을 바탕으로 정보를 비교해 가져오기만 하면 된다. . . . . 하지만 생각보다 로직을 짜기 힘들어서 고생 깨나 했다. public List GetRandomSkills(Dictionary friendshipDic, List skillList, int count) { // 랜덤으로 선택된 스킬을 임시 저장할 리스트 List chosenSkills = new List(); // count 개수만큼 스킬을 선택할 때까지 반복 while (chosenSkills.Count < count) ..

[유니티/C#] DataTable의 모든 행 읽어오기

원래는 간단한 테이블만 사용해서, 코드도 간단하게 만들어서 사용하고 있었다. 그런데 게임 기획이 바뀌고 데이터를 저장해야할 일이 많아져서, 기존에 사용하던 코드로 작업을 진행했다가는 돌이킬 수 없을것 같은 예감이 들었다. 아래에는 개편된 코드를 대략적으로 적어보려고 한다. 우선, 스킬들을 관리하기 위한 클래스를 작성했다. public class Skill { public int Skill_ID { get; set; } public int GodID { get; set; } public string SkillName { get; set; } public int SkillLevel { get; set; } public int SkillGroupID { get; set; } public int PriorSki..

[유니티/C#] NavMeshAgent 와 NavMeshObstacle

플레이어를 발견하면 추적하고, 공격 범위에 들어오면 공격을 하는 몬스터를 만들고 있다. 한가지 문제점은 플레이어가 도망가면 근접 몬스터가 줄줄이 따라오면서 대열이 만들어지고, 맨 앞의 몬스터가 공격상태에 들어가서 공격을 할 때, 뒤에있는 몬스터들은 추적 상태라 공격중인 몬스터를 밀고 들어오게 된다. 그러면서 플레이어도 함께 밀리고 도저히 공격을 할 수 없는 골치아픈 상황이 생겼다. 그래서 "NavMeshObstacle" 이라는 컴포넌트를 부착해 해결했다. NavMeshObstacle NavMeshAgent가 탐색하는 동안 피해야 하는 장애물 [ex) 물리적인 힘을 통해 움직이는 장애물 등] 을 인식한다. 장애물이 움직이는 동안 NavMeshAgent는 장애물을 피하기 위해 최선을 다한다. 장애물이 정지하..

[유니티/C#] DataTable로 엑셀 csv파일 읽어오기

DataTable을 사용해서 csv파일을 읽어와 게임 내 데이터를 관리하려고 했다. 하지만 전체 테이블과 행을 읽어오는것은 되는데 string으로 열을 불러와도 "" 이런식으로 빈 값만 반환되었다. DataManager 스크립트 // 리소스화 시킬 데이터테이블의 종류 열거형 public enum ECSVDatas { PlayerTable = 0, MonsterTable, End } public class DataManager { // 불러올 데이터테이블 딕셔너리 public Dictionary tableDic { get; private set; } = new Dictionary(); // 생성자 호출 시 자동으로 csv를 불러와 딕셔너리에 저장 public DataManager() { TableInit(..

[유니티/C#] 터치로 화면이동

참고한 블로그 https://blog.naver.com/dlehdgh1120/221706425033 public class CameraController : MonoBehaviour { //* 터치, 마우스 카메라 컨트롤러 *// Vector2 clickPoint; Vector3 touchStart; void Awake() { // 카메라 배율 초기화 Camera.main.orthographicSize = 10; } void Update() { if (Input.GetMouseButtonDown(0)) { // 마우스가 눌렸을 때 마우스 좌표 저장 // clickPoint = Input.mousePosition; touchStart = Camera.main.ScreenToWorldPoint(Input.m..

[유니티/C#] 터치/마우스로 카메라 이동

출처 - 참고한 블로그 https://bloodstrawberry.tistory.com/686 유니티 - 드래그로 카메라 이동(Drag and Move Camera) Unity 전체 링크 메인 카메라에 스크립트를 추가한다. 테스트하기 쉽게 왼쪽의 Alt가 입력된 경우에만 카메라가 움직이도록 하자. void Update() { if (Input.GetKeyDown(KeyCode.LeftAlt)) isAlt = true; if (In.. bloodstrawberry.tistory.com 전체 코드 public class CameraTest : MonoBehaviour { float dragSpd = 30.0f; Vector2 clickPoint; void Awake() { // 카메라 배율 초기화 Camer..