반응형

버튼들을 제어하는 오브젝트만들기


기존 운동선택 씬은 운동을 누르면 바로 운동측정 씬으로 이동한다. 여기서 나는 운동을 더 추가하고 운동마다 횟수 및 중량 입력창을 만들고 좀 더 비쥬얼적인 UI를 나타내 보려고 한다.

 

우선, 구현하고 싶었던 기능은 버튼 하나를 누르면 기존에 선택된 버튼의 색 및 상태를 초기화하고 누르려는 버튼의 상태를 변경하는 작업이다. 웹을 할때는 그냥 css 로 onFocus 나 onClick 으로 쉽게 하는데 유니티는 어떻게하는지 몰라 우리 지피티 형님에게 물어보았다.

 

 

뭐 여튼 정리하자면, 버튼을 관리하는 매니저를 만들어서 상태를 변경하고 함수를 실행하라고 한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // UI 관련 네임스페이스

public class ButtonManager : MonoBehaviour
{

    public Button[] buttons; // 버튼 배열
    public Color selectedColor; // 선택된 버튼의 색
    private Color defaultColor; // 기본 색
    // Start is called before the first frame update
    void Start()
    {
        defaultColor = buttons[0].GetComponent<Image>().color; // 첫 번째 버튼의 색을 기본 색으로 설정

        foreach (var button in buttons)
        {
            button.onClick.AddListener(() => OnButtonClicked(button)); // 각 버튼에 이벤트 리스너 추가
        }
    }

    void OnButtonClicked(Button clickedButton)
    {
        foreach (var button in buttons)
        {
            SelectExBtn selectedBtn= button.GetComponent<SelectExBtn>();

            selectedBtn.cancelEx();

            button.GetComponent<Image>().color = defaultColor; // 모든 버튼을 기본 색으로 변경
        }

        clickedButton.GetComponent<Image>().color = Color.cyan; // 클릭된 버튼의 색 변경

        SelectExBtn selectBtn = clickedButton.GetComponent<SelectExBtn>();

        selectBtn.selectEx();
    }
}

 

버튼을 클릭하면 모든 버튼 배열의 버튼을 초기화하고 클릭한 버튼의 상태를 변경하는 로직으로 작성했다. 이어서 버튼마다 따로 부착되어있는 스크립트를 통해 해당 운동의 laps, weight 인풋 필드를 켜고 끄게 하고싶어서 버튼마다 SelectExBtn 스크립트를 불러와 원하는 함수를 실행해 주었다.

 

 

오예스 잘된다.

 

UI가 너무 딱딱해 보여서 대충 애셋 스토어를 뒤져 공짜 UI를 가져왔는데 너무 구리다. 이런.

 

이제 선택한 운동 정보들을 다음 씬으로 넘겨야 하기에 DataManager 에 저장해야한다.

 

 

버튼 클릭시 해당 함수들을 호출해 DataManager에 저장 !

반응형
반응형

벌써 2023년도 마지막 날이다. 이번 년도는 무엇을 했을까? 개발적으로 성장은 많았을까? 한 번 나열을 해보자

  1. 5학년을 무사히 마치고 졸업완료
  2. 캡스톤 디자인 장려상
  3. 백준 골드 3달성
  4. 오픽 IH

음.. 이게 단가..? 오마이갓 졸업말고 크게 한게 없다,,

 

10월부터 조금씩 취업문을 두드려봤다. 좋지못한 필력으로 자기소개서를 작성하고 코딩테스트를 치뤘다. 그 결과는 ..?

 

 

서류 18전 3승 2무 13패

 

기적의 서류 합격률.. 물론 자기소개서를 검증받지 못하고 '아 귀찮다! 여기까지만 쓸래' 하면서 냈던게 많아 기대는 안했다. 그럼에도 신기한건 LG 유플러스가 어떻게 서류합격을 했는지 의문이다.

 

이제 나의 문제점을 살펴보자

자기소개서


일단 자기소개서를 너무 개떡같이 썼다. 첨삭은 글은 잘쓰지만 문과계열 형한테 받았던지라 공대스러운 자소서가 되지 않았다. 내 프로젝트를 이용해 나만의 강점이 들어나는 글을 썼어야 했는데 그러지 못했다. 23하반기에는 졸전준비한다는 명목하에 좀 널널하게 했지만 이제 진짜 취준생이기에 그러면 안된다.

 

더보기

24년도에는

  1. 학교 서비스를 이용해 자소서 첨삭을 받는다.
  2. 친구들에게 첨삭을 받는다.
  3. 나의 프로젝트별 강점 및 특징을 정리해 자기소개서에 START 형식으로 적어놓기

경험


내가 학교를 다니면서 진행한 프로젝트는 (웹2 + 앱2 + 임베디드1) 이다. 나는 프론트엔드 개발자를 희망하지만 웹 프로젝트에 크게 강세는 없어보인다. 웹 개발을 했다고 하지만 체계적인 학습을 하지 않아서 리액트에 대한 지식도 부족하다.

 

더보기

24년도에는

  1. 사이드 프로젝트를 2개 만든다.
  2. 강의를 통해 NextJs 공부를 한다.

 

코딩테스트


3학년 여름방학때 첫 시작한 코딩테스트 준비. 백준에서 시작하고 마구잡이로 골드5까지 올려놨었다. 그 이후로 방치하고 4학년 막학기 될 때쯤 필요에 의해 다시 시작하게 되었다. 코딩테스트 빈출 유형 위주로 조금씩 풀어 골드 3까지 올려놓았다. 하지만, 코딩테스트 시험에 번번히 낙방하고 졸전도 마무리에 다다라 코딩테스트를 잠깐 하차했다.

 

더보기

24년도에는

  1. 1일 최소 1개의 문제풀기
  2. 종만북을 이용해 알고리즘 기초다지기

 


23년도 우여곡절이 많았던 1년 이었다. 이제 나의 새로운 목표 새로운 출발을 위한 기로에 서있다. 내가 뛰어나가면 결승선은 바로 다가올 것이고 내가 걸으면 결승선은 멀기만 할 것이다. 뛰는게 물론 좋은것만은 아니다. 걷더라도 걸음 하나하나를 느낀다면 최선을 다한 레이스가 될 것이다.

반응형

'Day Life' 카테고리의 다른 글

[MSI 모던14] 블루투스, 와이파이 드라이버 어댑터 설치  (1) 2022.10.05
2022/08/06  (0) 2022.08.06
21.08.13  (0) 2021.08.13
실버 달성  (0) 2021.04.27
HI  (0) 2021.04.21
반응형

배경


모델에 양 손에는 Grib 이라는 스크립트가 적용되어 있다. 이 스크립트를 통해 바벨과의 연결을 및 동선을 확인해주는 라인렌더러가 있다. 그런데 어느 순간부터 한쪽 스크립트가 빌드 할 때마다 오류가 나서 스크립트를 귀찮게 자꾸 적용시켜줘야 했다. 이정도 쯤이야 귀찮지만 그냥 빌드할 때마다 바꿔줬다. 하지만, 씬을 여러개 만들고 씬 이동할 때도 똑같은 현상이 발생해 어쩔 수 없이 고쳐야 하는 상황이 됐다.

 

스크립트 실행 순서 변경


부랴부랴 검색 및 지피티 형님께 물어보았고 유니티 캐시를 삭제한다던가 스크립트를 분리해보던가 다해보았지만 되지 않았다.

 

마지막 방법인 유니티 스크립트 실행 순서 를 건드려보았다. RightGrib 의 순서를 기본 값보다 1 우선순위를 주었다.

 

 

Edit / Project Setting / Script Execution Order 에서 설정하면 된다.

 

순서를 건드렸더니 문제가 해결되었다. 정확한 문제의 원인은 모르겠으나 해결하는 방법은 알게 되었으므로 하나 배웠다.

반응형
반응형

배경


스마트워치의 가속도 데이터는 필터링이 거쳐지지 않은 데이터다. 따라서, 노이즈 및 조그마한 변화에도 값이 확 튀게 된다. 이를 위해서 필터링 과정이 필요하다. 필터링을 위해 칼만필터를 사용하기로 했다.

 

칼만필터는 쉽게 말하면 이전 데이터들을 토대로 다음 데이터를 예측하는 필터다. 데이터가 추가될 수록 칼만필터의 필터링 변수들이 최신화되고 최신화된 변수들의 값을 통해 다음 데이터를 예측한다.

class KalmanFilter(q: Float,r: Float,p: Float,  x: Float, k: Float) {

    private var q: Float = q // process noise covariance
    private var r: Float = r // measurement noise covariance
    private var x: Float = x // estimated value
    private var p: Float = p // estimation error covariance
    private var k: Float = k // kalman gain

    fun update(z: Float): Float {
        // prediction update
        p = p + q

        // measurement update
        k = p / (p + r)
        x = x + k * (z - x)
        p = (1 - k) * p

        return x
    }
}

 

자세한 칼만필터 공식은 인터넷 검색하면 잘나온다 ~ ㅎㅎ 나는 이렇게 클래스를 만들어 사용했다.

하지만, 스마트워치의 가속도 센서가 안좋은지는 몰라도 움직임을 트래킹하는데 있어 정확한 자세가 측정되지 않았다.

문제 : 적분 드리프트


가속도 데이터를 이용해 트래킹을 하려면 이동거리 데이터로 이중적분을 해야한다. 하지만, 적분의 기초를 알게되면 적분시 적분상수값이 생성되는 것을 알 수 있다.

 

두번의 적분을 하게된다면 두개의 적분상수가 생성되므로 이게 누적되어 드리프트 (원래 값보다 값이 상승 혹은 하락) 현상이 발생한다.

 

이를 해결하기 위해 여러 방법을 고안했다.

첫번째 방법 : ZUPT 알고리즘


ZUPT(Zero velocity UPdaTe) 영속도 보정 알고리즘을 이용해보았다. 대충 설명해보자면 일정 임계값내의 가속도 데이터 값은 정지상태임을 가정하고 속도를 0으로 계산하는 방법이다.

 

필터링연구를 하면서 ‘정지 상태’를 인지해야함이 중요하다는 것을 알게되었다. 가만히 있어도 가속도데이터는 측정되기 때문에 오차가 발생할 확률이 증가한다.

 

따라서, ZUPT 알고리즘을 도입했고 아래 코드와 같이 제작해보았다.

if ((accX < threshold && accX > -threshold) && (accY < threshold && accY > -threshold) && (accZ < threshold && accZ > -threshold))
        {
            x += veloX * dT;
            y += veloY * dT;
            z += veloZ * dT;

            veloX = 0f;
            veloY = 0f;
            veloZ = 0f;
        }

 

두번째 방법 : 모델의 움직임 제한


 

위의 방법들을 통해서도 드리프트 현상은 해결하지 못했다. 나의 능력 부족이라 생각했다. 하지만, 전시회에서 시연을 해야하므로 일단 해결은 해야했다. 따라서, 모델의 움직임을 제한하고 운동기구가 손에서 벗어나지 않는 범위내에서 움직이게 한다면 그럴싸하게 보일 것 이라 생각했다.

 

따라서, 어깨축을 중심으로 구형태의 범위로 제한하다면 좋은 결과물이 나올것이라고 생각이 들었다.

if (distance > radius)
{
      // 오브젝트를 구의 표면에 놓아서 원점에서 지정된 반지름만큼 떨어뜨립니다.
            // moveObeject 는 바벨
      Vector3 fromOriginToObject = moveObject.transform.position - initPos;
      Vector3 fromOriginToObject2 = moveObject2.transform.position - initPos2;
      fromOriginToObject *= radius / distance; // 거리를 반지름으로 정규화
      fromOriginToObject2 *= radius / distance; // 거리를 반지름으로 정규화
      moveObject.transform.position = initPos + fromOriginToObject;
      moveObject2.transform.position = initPos2 + fromOriginToObject2;

            //범위가 radius 값을 초과하면 값을 끝값에 초기화
            x = moveObject.transform.position.x;
            y = moveObject.transform.position.y;
            z = moveObject.transform.position.z;
}

 

 

움직인 범위를 빨간공으로 나타내어 봤는데 딱 구형태로 잘 움직인는 것을 보니 뿌듯했다.

 

하지만


위의 해결책은 잠시나마 꼼수로 한 것이다. 너무 너무 아쉽지만 나중에 IMU 센서 혹은 MPU6050 을 이용해 나의 해결책이 틀린건지 센서가 이상한건지 교차검증 해보고는 싶다.

반응형

+ Recent posts