ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 24년 5월 15일 TIL
    공부 기록 2024. 5. 15. 23:08

    SpriteRenderer 

    Image를 표현 하는 Component다. Color를 변경 할 때 색을 바꾼다 라기보단 색을 입힌 다는 느낌이다. 

    하얀 색에서 노란 색으로 변경이 아닌 하얀색에 노란 색을 입히는 느낌. 빨간색이였던 거에 노란 색으로 변경을 하면 덜 노란색이 된다. 

    Order in Layer 가장 작은 값이 제일 뒤로 깔린다.

     

     

    Project 화면에서 Object를 만들 경우 에셋이 되어서 간편하게 Object를 생성 할 수 있다. 

     

    Ctrl + D -> duplicate 복제

     

    Camera는 기본적으로 z축으로 -10이 되어 있다. 뒤에서 찍어야 하니까, 0으로 바꿔둔 사람도 있지만 그렇게 하면 안 된다. 

    Orthographic 2D 이미지다. 입체감이 없다.

    세로의 반 size가 무엇이냐. 8을 하게 되면 y축으로 16정도로 보이게 된다. 이게 무슨 소리지.

     

    isTrigger 물리적 충돌을 인지만 하구 충돌효과는 일어나지 않는다. 밀려나거나 그러지 않음.

     

     

    UI 

    기본적으로 Canvas 위에 올라가있다. 

    항상 기준을 맞추고 그거에 맞춰서 늘리거나 줄여야 한다. 이것을 반응형 이라고 한다. 뭔지 모르겠다.

    UI Scale Mode → Scale wigh Screen Size → 1920 1080기준으로 작업 하게 할 수 있따. 가로로 조금 늘어나게 된다면 안 변하는 걸로 하고 세로에 대해 늘어났다면 커질 수 있도록 작업 할 수 있다.

    Text - TextMeshPro → import TMP Essentials 기본적인 텍스트 메시지에 대한 세팅이 완료 됨

     

     

    함수를 작성 할 때 자동완성을 이용 해서 해주는 것이 좋다. 

    매개변수나 오타로 인한 오류들을 피할 수 있기 때문이다.

     

     

    Project Build

    File → Build Setting

    Scenes In Build에 SampleScene이 없다면 Add Open Scenes 클릭

    하단의 Build 버튼 클릭

    폴더 선택해서 Build 하기.

     

     

    Google에 Component 이름 검색 하면 공식 문서 나온다. 자주 참고 하는 습관을 들이면 좋다.

     

     

    Fixed Update 물리적인 효과 업데이트

     

     

    Pixels Per Unit 

    1 Unit당 몇 Pixel이냐를 설정 하는 것이다. 

    ppu가 커질 수록 Sprite는 작아진다. 이는 더 높은 해상도의 물리시뮬레이션을 가능 하게 함.

    ppu의 값이 높을 수록 더 많은 연산을 필요로 한다. 그러니 필요한 만큼의 ppu값을 설정 하는 것이 중요.

    모든 Sprite에 대해 일관 된 ppu 값을 사용 하는 것이 좋다. pixel perfectcamera 같은 건 기본적으로 픽셀이 모두 같다라고 생각을 하는 기능도 있다. 이런 애들은 ppu 값이 다를 경우 정상적으로 작동을 안 할 수 있다. 

     

     

    계층구조란

    유니티에서 작업을 효율적으로 하게끔 해주는 기능이다. 

    부모오브젝트의 트랜스폼을 변경 하게 되면 자식 구조도 같이 변경 되게 되는데, 이 기능은 여러 번 옮겨줘야 하는 것을 한 번에 해줌으로써 사용자에게 편리함을 제공 해준다. 트리구조라고도 한다. 

    local 좌표계 - 부모에 대환 좌표다. xyz의 값이 부모Object에 위치로 적용 된다. 

    localPosition, localRotation, localScale

    월드좌표계 - 월드 전체에서 참고 되는 좌표, xyz가 월드 기준으로 정해지는 것.

     

     

     

    Input manager 

    유니티에 입력 System 중에 하나이다. 출시가 된지는 4~5년 정도 됐다. 

    유니티 프로그램에 명령어들에 키를 저장 시켜두고 GetAxis 등과 같은 함수로 키가 눌렸을 경우에 실행을 하게 할 수 있다. Horizontal, Virtical 등 

    Edit -> Project Setting -> inputManager -> Axes -> Horizontal, vartical 등 설정 변경 가능.

    요즘도 많이 사용 하는 방식이지만, 확장성이나 유지보수에 대해서 좋지 않다. 

     

    사용하려면 Rigidbody Component가 있어야 한다. 그리고 매 프레임마다 Vertical축과 Horizontal 축을 가져온다. 

    float vertical = Input.GetAxis(”Vertical”);

    float horizontal = Input.GatAxis(”Horizontal”);

    이름 정확히 입력 해야 한다.

    Vector2 direction = new Vector2(horizontal, vertical);

    변수 하나로 만들어 줘서 트랜스폼을 변경 하게 할 값을 구해준다. 

     

    이렇게 하면 direction 에는 gorizontal이나 vertical 축이 눌렸을 때 1이나 -1로 변경이 되고 그 값으로 움직이게 된다. 이 때 1,1 일 경우에 2가 되어서 더 멀리 가는 경우가 생길 수 있어서 정규화 라는 것을 해줘야 한다. 

    Vector의 정규화 - normalized 하면 된다.

     

     

    GetComponent 

    겟컴포넌트 자체를 변수로 만들어 주고 사용 하면 매번 겟컴포넌트를 할 필요가 없다. 튜터님은 이걸 갈고리 걸어 놓는다고 표현 했다. 

     

     

    캐릭터 움직이는 거에 대해서

    나는 중력효과로 캐릭터를 움직이는 게 중력을 줘서, 손가락으로 밀어서? 튕겨서 그 느낌으로 캐릭터를 움직인다라고 생각 했고 별로 좋지 않다고 생각 했다. 그게 아니고 그 방향으로 밀어준다는 느낌으로 캐릭터를 움직이게 한다고 한다. 그리고 Transform으로 캐릭터를 움직이는 건 캐릭터의 위치를 계속 바꾸는 것이기 때문에 문제가 있다고 한다. 좋은 방법은 아니라고 한다. 텔포를 계속 하는 느낌인 것 같다.

     

     

    InputSystem

    유니티의 입력 시스템 중에 하나이다. 인풋매니저와 달리 확장성이나 유지보수성이 좋다. 

     

    인풋시스템을 통해 특정키가 눌렸을 때 특정함수가 실행 되게 하고 그것으로 움직이게 하거나 특수한 것들을 하게 할 수 있다.

    상속관계를 만들어서 여러개의 액션을 가진 맵을 만들고 편리하게 사용 할 수 있다. 

     

    작성방법

    폴더 하나 작성(Input) → Input Action 생성(이름생성) → 액션 열고 컨트롤스킴 추가 → 액션맵을 추가(알맞는거 ex.Player) → 액션 추가 → 액션값 설정 → Binding 추가 → 바인딩패스 설정해주기 → save 에셋.→인풋 컴포넌트 오브젝트에 추가 → 이후에 코드 작업

     

    Action 설정 할 때 Value랑 Type 정해 주지 않으면 프리셋 안 나온다. 

     

     

    Object 만들 때 Sprite용 객체를 따로 만들어 주면 회전 하는 모습을 주고 싶을 때 Sprite만 회전 하게 할 수 있다.

     

     

    입력처리와 실제로직 실행 주체를 분리를 하지 않으면 유지보수가 굉장히 어려워진다. 분리만 해놓는 게 아니라 상속관계를 만듦으로써 일괄적으로 관리하게 용이 하게 할 수 있다. 

    하나의 대상이 하나의 역할만 하는 것을 단일책임원칙이라고 한다. 

    인풋시스템은 액션이 발생 해야만 움직이거나 기능이 실행 되는 것이 아쉽다.

     

     

    옵저버패턴

    함수 호출을 하는 곳 한 가지만 두는 형식? 이다.

    여러 클래스에서 호출을 요청 하고 한 가지 클래스에서만 호출을 하게 한다. 

    이벤트형식을 많이 사용 한다. 

    탑다운컨트롤러라는 클래스에서 호출을 하고 플레이어 클래스에서 움직이는 좌표값을 설정 하고 그리고 무브먼트 클래스에서 그 좌표에 맞게 움직이게 했다.

    함수를 작성 할 때 ?. 붙이면 없으면 노실행 있으면 실행한다. 

    이벤트 메서드에 사용 했다. 이벤트에 등록 된 함수가 있으면 실행. 

     

     

    a에서 b로가는 방법

    b- a다.

    좌표 구할 때 a는 내위치, b는 내가 갈 곳

     

     

    타일맵 제작

    2D⇒ Tilemaps → 랙탱귤러 - > 그리드 자동생성 타일들 생성 됨.

    타일 에셋에서 드래그로 넣어주고 타일 꾸며주면 됨.

    타일을 깔아줄 때는 구역마다 오브젝트를 생성 해주는 것이 좋음 ex) 바닥, 벽, 등등

    나중에 관리하기 편하다. ex) 벽만 지우기, 바닥만 지우기 등등

    컬리전용도로 타일맵을 만들고 투명하게 만들어서 밖으로 안 나가게끔 편리하게 ㅅ러정 할 수 있다. 

    보통 SpriteRenederer를 끄거나, Color에 마지막 값을 0으로 만들어서 투명하게 한다. 

    그리고 타일맵컬라이더를 추가 하면 된다. 

     

     

    쿼터니언 

    우리는 위치나 회전의 값을 계산 할 때 xyz를 사용 하는데 내부적으로는 4가지의 숫자를 가지고 계산을 한다.

    회전을 할 때 중요한 게 있다. xyz로만 회전을 사용 할 경우 짐벌락 문제 생긴다. 회전이 정상적으로 작동 되지 않는 것. 그래서 우리는 회전을 계산 할 때 xyz값이 아닌 쿼터니언 값으로 계산을 해줘야 한다. 

    이건 직접 값을 변경 하거나 계산을 해줄 수 있지만 내장 함수를 사용 하는 것이 권장 된다. 

    Quaternion.Euler : 오일러 각을 쿼터니언으로 바꿈

    Quaternion.LookRotation :

    Quaternion.Slerp :

     

     

    ArcTangent 

    좌표를 통해 각도를 알게 해주는 것이다. x,y의 값으로 각도를 알 수 있게 함. 

    개발자들이 침을 흘린다는데 몇 년 지나도 나는 안 흘릴듯.

    좌표의 값으로 오일러 각도를 알려면 아크탄젠트를 사용 해서 라디안 값을 구하고 그걸 디그리로 바꿔줌으로써 오일러각도를 알 수 있게 된다. 그리고 이 오일러각도를 다시 쿼터니언으로 변경을 해줘서 회전을 계산 해야 짐벌락현상이 일어나지 않는다. 자세한 사항은 나중에 .

    사인 코사인 탄젠트... 아크탄젠트 

     

     

    prefebs 

    게임 오브젝트를 하나의 에셋처럼 사용 한다라는 느낌.

    재사용 가능 하고 관리 하기 쉽게 만들기 위한 템플릿, 프리셋이다.

    일관성을 유지하고, 일괄적인 업데이트를 쉽게 할 수 있다.

    프리펩은 레벨 디자인, 재사용 가능한 게임 요소(캐릭터, 아이템, 장애물 등)의 생성, 프로토타이핑 등에 주로 사용 된다.

     

     

    instactiate 

    그냥 생성 하는 것이 아닌, 새로 생성 하고 이를 반환 하는 것이다. 

     

     

    공격기능을 구현 할 때 마우스 클릭이 된 좌표를 구해와서 그 좌표를 통해 오일러각도를 알아내고 쿼터니언으로 바꿔서 그 각도로 공격이 나가게끔 함.

     

     

    스텟 시스템 구현 한 방법

    SO를 통해 스텟시스템을 만듬.

    스텟은 Inspector 에서 설정 가능. 

    객체 생성 하구 그 객체에 스텟에 따라 공격속도, 및 공격력 참조

    자세한 사항은 나중에

    so 만들고 객체 만들고 값 넣어주고 다른 곳에서 스텟 참조하고 현재 스텟 만들고 베이스 스텟 만들고

    자세한 사항은 나중에

     

     

     

    업데이트가 상속관계로 2개 이상일 경우에 발생 하는 문제는 버츄얼을 통해서 해결 할 수 있다. 

    부모 update를 virtual로 만들어주고 자식 class에서 override를 해주고 base.updat를 통해 부모클래스에 함수들도 실행 하게 하면 된다. 

    '공부 기록' 카테고리의 다른 글

    24년 5월 20일 TIL  (0) 2024.05.20
    24년 5월 16일 TIL  (0) 2024.05.16
    24년 5월 9일 TIL  (0) 2024.05.09
    24년 5월 8일 TIL  (0) 2024.05.08
    24년 5월 7일 TIL  (0) 2024.05.07
Designed by Tistory.