오늘 학습 키워드

최종 팀 프로젝트, 회사 생활 전에 알아두면 좋을 것들들

오늘 학습 한 내용을 나만의 언어로 정리하기

메테오 발사체 만들기 (MeteorController)

  • 메테오의 조건은 다음과 같았음.
    • 시작 시, Z축 각도가 -22.5~22.5도 사이의 랜덤한 값으로 지정됨
    • 시작 시, 크기가 1배에서 2.5배 사이로 랜덤하게 지정됨.
    • 아래 방향으로 내려오는 속도는 8f임
    • 플레이어, 바닥, 혹은 플랫폼에 닿으면 사라짐.

비효율적인 계산?

  • 아래 방향으로 내려오게 만들려는데, 곱셈 연산의 순서가 비효율적이라고 나옴.
  • 그래서 velocity * Time.deltaTime을 따로 저장해두려고 함
  • 그리고 -transform.up 도 각도 바뀔 때 미리 캐싱하기로 함
// MeteorController.cs
/// - 속도는 8f (Rigidbody Mode = Kinematic이기 때문에, 내부 코드로 이동 구현 필요)  
private float velocity = 8f;  
  
private float adjustedVelocity;  
  
/// - 시작 시 Z축 각도가 -22.5~22.5 사이의 랜덤한 값으로 돌아감 (총합 45도)  
private float randomAngleZ;  
  
private Vector3 downDirection;
 
protected override void Awake()  
{  
    base.Awake();  
      
    randomAngleZ = Random.Range(-22.5f, 22.5f);  
    randomSize = Random.Range(1f, 2.5f);  
      
    // 생성될 때 랜덤 각도와 크기 지정  
    transform.rotation = Quaternion.Euler(new  Vector3(0f, 0f, randomAngleZ));  
    transform.localScale = Vector3.one * randomSize;  
  
    downDirection = -transform.up;  
}  
  
private void FixedUpdate()  
{  
    adjustedVelocity = velocity * Time.deltaTime;  
    transform.position += (downDirection * adjustedVelocity);  
}
 

레이어 계산하기

protected override void OnTriggerEnter2D(Collider2D collision)  
{  
    // 1. 바닥/플랫폼에 닿았는가?  
    // 방법 설명 : (여기서, 땅의 레이어 번호는 6번, 플랫폼은 7번, 플레이어는 1번으로 가정)  
    // 닿은걸 기준으로 설명  
    // collision.gameObject.layer = 6  
    // 1 << collision.gameObject.layer = 1 << 6 = 0010 0000    // groundMask = 0110 0000    // 따라서, 만약 바닥이나 플랫폼에 닿았다면 and 연산을 했을 때   
// 6번 자리 혹은 7번 자리가 1이 됨. 그래서 0이 아니게 됨.  
    // 그런데 만약 플레이어에게 닿은거라면  
    // 1 << collision.gameObject.layer = 1 << 1 = 0000 0001  
    // groundMask = 0100 0000    // 따라서 and 연산을 하면 0이 되기 때문에, 이 부분은 스킵된다.  
    if ((1 << collision.gameObject.layer & groundMask) != 0)  
    {  
        RequestRelease();  
        return;  
    }  
      
    if ((1 << collision.gameObject.layer & playerLayer.value) != 0 &&  
             collision.TryGetComponent(out IDamagable damagable))  
    {  
        if (damage > 0)  
        {  
            damagable.TakeDamage(damage);  
            Debug.Log($"[{name}] Player hit - damage {damage}");  
        }  
        RequestRelease();  
    }  
}

기존의 백그라운드 이펙트 로직 수정

  • 원래는 포인트 컬러 하나랑 블랙 하나로 무조건 지정이었음
  • 근데 그거를 그냥 포인트 컬러 두개로 변경함
  • 왜냐면 색을 바꾸고싶지 않은 부분은 그냥 흰색을 넣어두면 되기 때문
public override async UniTask EffectAsync(EffectOrder order, CancellationToken token, GameObject target = null, Vector3 position = default(Vector3))  
{  
      
    try  
    {  
       //빨강. 컬러를 이 SO의 PointColor로 바꾸기  
        //검정. 컬러를 검정으로 바꾸기  
        ChangeMapColor(StageManager.Instance.ColorBgs, FirstPointColor);  
        ChangeMapColor(StageManager.Instance.BlackBgs, SecondPointColor);  
  
         
        ChangeCharacterColor(PlayerManager.Instance.player.gameObject, SecondPointColor);  
        for (int i = 0; i < StageManager.Instance.currentStageController.aliveMonsters.Count; i++)  
        {  
            ChangeCharacterColor(StageManager.Instance.currentStageController.aliveMonsters[i], SecondPointColor);  
        }  
          
  
        //Duration초 동안 지속되도록 하기  
        //끝나면 원래대로 돌려놓기  
        await UniTask.Delay((int)(Duration * 1000), cancellationToken: token);  
          
    }   
    catch (OperationCanceledException)  
    {  
        Debug.LogWarning($"[이펙트: UniTask (ID : {effectId})] EffectAsync operation cancelled");  
    }  
    catch (Exception e)  
    {  
        Debug.LogError($"[이펙트: UniTask (ID : {effectId})] EffectAsync operation failed: {e}");  
    }  
    finally  
    {  
        ChangeMapColor(StageManager.Instance.ColorBgs, Color.white);  
        ChangeMapColor(StageManager.Instance.BlackBgs, Color.white);  
          
        ChangeCharacterColor(PlayerManager.Instance.player.gameObject, Color.white);  
        for (int i = 0; i < StageManager.Instance.currentStageController.aliveMonsters.Count; i++)  
        {  
            ChangeCharacterColor(StageManager.Instance.currentStageController.aliveMonsters[i], Color.white);  
        }  
          
    }  
}

플레이어가 특정 애니메이션을 송출하도록 강제

// PlayerController.cs
/// <summary>  
/// 조건 : animParameter는 Trigger 형태여야 함.  
/// </summary>  
/// <param name="animParameter"></param>  
public void ForceChangeAnimation(int animParameter)  
{  
    Animator.animator.SetTrigger(animParameter);  
}
 
// TestManager.cs
 
protected void Update()  
{  
        // 3보스 QTE 테스트 코드  
    if (Input.GetKeyDown(KeyCode.LeftArrow))  
    {  
        PlayerManager.Instance.player.runFSM = false;  
        PlayerManager.Instance.player.ForceChangeAnimation(AnimatorHash.PlayerAnimation.StartQTE);  
    }  
  
    if (Input.GetKeyDown(KeyCode.RightArrow))  
    {  
        PlayerManager.Instance.player.ForceChangeAnimation(AnimatorHash.PlayerAnimation.SuccessQTE);  
    }  
      
    if (Input.GetKeyDown(KeyCode.DownArrow))  
    {  
        PlayerManager.Instance.player.ForceChangeAnimation(AnimatorHash.PlayerAnimation.EndQTE);  
        PlayerManager.Instance.player.runFSM = true;  
    }  
}
 

회사 생활 전에 알려두면 좋을 것들

법적 의무와 권리

  • 당신이 한 모든 작업은 법인에 귀속됨.
    • 사원이 참여한 작업물은 모두 회사 소유
    • 포트폴리오에 담게 될 경우 어디까지 담을 수 있을지 문의해야 함
      • 생각보다 많은 회사가 굳이 말 안해도 허가는 해줍니다. 다만 서버코드를 내 개인 AWS에 올리면 법적 문제가 될수있으므로 개인 소장만 해야 함 (라고 튜터님이 하심)
    • 미공개/대외비를 유출할 경우 소송/형사처벌 가능함
  • 인수인계는 의무가 아님!
    • 퇴사 일정을 상호 합의한 상황이라면 퇴사 전까지는 인수인계에 신경 써줄 필요 있음.
    • 인수인계 방식은 회사 합의
      • 과도한 요구다 싶으면 반드시 조율할 것
    • 급 퇴사를 당했다면, 또는 퇴사 후에도 와서 인수인계해달라 하면 대응할 필요 없음.
    • 인수인계를 빌미로 퇴사를 연기하거나 안받아줌 신고대상임. 의무 아니라고 말하고 나오면 됨
  • 겸업 금지 조항
    • 회사의 노하우나 대외비를 이용해 개인의 이익을 도모하는 것을 막기 위한 조항
    • 업종과 다른 분야를 겸업하는 경우 회사의 승인하에 허용하는 경우도 있음
    • 개인 프로젝트를 재직 중에 진행하고 싶다면
      • 회사 허락을 받거나
      • 요령껏 할 것(걸리지 말기,…ㅋ)
    • 겸업하다 걸리는 경우 높은 확률로 징계 or 해고
  • 연차와 연차수당
    • 연차는 기본적으로 5인 이상 사업장에서만 의무적으로 지급임!!!
    • 연차 지급 기준
      • 같은 회사에서 1년 이상 근무하게 되면 15일의 연차 지급
      • 이후 2년 근속마다 연차 1일씩 추고, 최대 25일까지 지급
    • 연차를 지급받은 후 1년 내 소진하지 못했다면 1일당 연차 보상을 지급해야 함
      • 법적으로는 그런데, 연차 소진을 종용하는 경우도 많음
      • 가급적이면 쓰세요
  • 권고사직 : 실업 급여와 위로금(회사)
    • 권고사직 : 퍼포먼스가 떨어지거나 구조 조정, 재정적 문제가 발생할 경우 회사에서 직원들에게 권고 사직을 제안하기도 함.
      • 이 경우 사원들은 실업 급여를 수령 가능함
      • 단 재직 중 고용보험 피가입 기간이 180일 이상을 넘어야 함 (일반적으로 7~8개월)
        • 일 시작한지 얼마 안돼서 권고 사직 당하면 못 받음
    • 위로금은 잘 안줌. 기대하지마셈
  • 급여가 밀릴 경우
    • 아주 간혹 있음.
      • 반드시 확인할 것
        • 왜 못 주는지, 언제까지 받을 수 있는지, 이 상황이 계속 이어질 수 있는지
    • 밀린 급여를 언제까지 받을 수 있는지 확인.
      • 급여 지급 의사가 없음을 밝히거나 약속이 이행되지 않으면 신속히 노동부에 진정을 넣을 것.
        • 그렇지만 노동부에 넣는다고 해서 신속히 해결되지는 않음..
        • 진정 절차 = 서류 작업 + 번거로움
        • 최소 수 개월 소요
        • 대체로 받아낼 수는 있음.
        • 인터넷에 절차가 나와있음!

입사와 퇴사

  • 성실하되 비굴해지진 마라.
  • 수습 기간 중 짤리더라도 일한 기간에 해당하는 급여는 받아야됨.
    • 수습생도 정규직임!
  • 검증이 덜 되었거나 좀 애매하면 상호 합의 하에 수습 기간을 연장하는 경우도 있음.
  • 계약직으로 1년 계약하고 정규직 전환 검토하는 경우도 있음. (이 경우 입사 제안할 때 결정)
  • 수습 기간이라고 일반 사원과 연봉을 차별하지는 않음. (해봤자 90%정도?)
    • 다만 혜택이나 복지는 안주는 경우도 있음. (워크샵, 복지 포인트 등)
    • 연봉을 일부만 준다고 하면 좀 고민해보셈..
      • 수습 기간이 3개월 이상으로 길어지면 3개월 이상부터는 100% 지급해야함.
      • 단순 노무직 or 1년 이내 계약직은 제외
    • 급여 관련된 건 면접이나 합격 통보 때 알려줘야 정상. 입사 전에 물어봐도 ㄱㅊ
    • 급여 체계는 제대로 확인하셈.
  • 연봉 협상 : 일단 질러봐라.
    • 경력 없는 신입이라고 해서 소극적으로 나갈 필요는 없음.
    • 희망 연봉 있다고 해서 합격시키지 않는 회사는 없음.
    • 다만 회사 내 신입 연봉 테이블이 있을 경우 맞추겠다고 하는게 더 좋음
    • 최근 연봉 최저선은 2천 후반대. 괜찮은 회사라면 3천 초중반도 줌.
      • 4천 이상 준다!? 그럼 인재에게 충분한 배려를 해준다…
    • 막상 입사했더니 제시한 연봉과 다르다?? 나오세요 그냥
  • 포괄임금제 : 추가 근무 수당을 연봉에 포함시키는 임금제.
    • 업무 퍼포먼스는 안 나오는데 초과 근무 수당만 받아가면 안 좋은 쪽으로 찍힘
  • 퇴사 한다고 막 나가지 마라
    • 마무리까지 아름다웠을 때 좋은 이별이 가능함
      • 인수인계 잘 했는지
      • 자료 잘 보존 했는지
      • 회사와 일정을 잘 지켰는지
      • 주변 사람들과 인사는 잘 하고 나왔는지
    • 회사가 아무리 싫어도 소송할 수준이 아니면 깔끔히 마무리 하세요
  • 기본적인 퇴직금 지식
    • 퇴직금을 받으려면 1년 이상 근무해야 함
      • 월급에서 일정 비율로 퇴직금을 떼어가 쌓아둠.
      • 퇴사할 때 쌓아 놨던 퇴직금을 지급
    • 퇴직금 지급 방식
      • 퇴직금 일괄 지급 : 쌓아 놨던 퇴직금을 한 번에 지급
      • 퇴직 연금 : 퇴직금을 연금 계좌로 지급
        • 개인 연금 계획에 맞춰 금융 상품으로 운용 가능
        • 55세 이후에 찾으면 비과세
        • 중간에 찾을 수 있지만 그동안 쌓인 수익(이자)에 세금이 적용되면서 퇴직금 세일 돌입
    • 퇴직금의 중간 정산
      • 회사 다니면서도 퇴직금은 받을 수 있음
      • 고용노동부가 정한 특정한 경우(주택 구입, 부양 가족의 장기 부상/질병, 파산선고, 개인 회생 절차 등)에만 가능

억울함에서 건져줄 팁

  • 언제 어디서나 기록은 중요하다.
    • 기획을 했다면 기획서, 근무를 했다면 근태기록으로.
    • 외부와 소통할 때 중요한 것
      • 채팅 기록
      • 이메일
      • 통화 기록
        • 상대의 동의를 구하고 하세요!!!!
        • 통화를 미팅 형식으로 진행했다면 미팅 내용을 정리해서 이메일(or 채팅)으로 반드시 공유 할 것
  • 레퍼런스 체크 : 회사 생활을 상식적으로 해야 하는 이유
    • 늘 레퍼체크를 하지는 않음
    • 다만 규모가 큰 회사거나 인재 채용에 신중한 회사 일수록 레퍼런스 체크를 하는 경우가 많음.

이직 하기 좋은 타이밍

  • 무조건 경력 1년은 채우고 나오셈.
    • 경력 1년 이하는 경력자로 대우받기 애매한 경우가 많음
  • 가장 이상적인 첫 경력 이직 타이밍
    • 2~3년차
    • 4~5년차
    • 프로젝트 경험도 있고, 회사 돌아가는거 알고, 몸값이 글케 비싸진 않은데 일은 잘할 확률 높음
  • 물론 재직 중인 회사에 만족 중이라면 억지로 이직할 필요는 없음
    • 생각보다 이직은 스트레스가 많음
    • 잦은 이직은 오히려 해로운 경우도 있음

그 외 팁

  • 법인의 피고용인으로서 일을 하게 될 경우 법인의 사업 결과와 그 책임을 피고용인에게 물을 수 없음.
    • 프로젝트를 망해도 우리의 책임은 아님.
    • 다만 본인의 실수 or 고의로 회사에게 금전적 피해를 입히거나 명예를 훼손한다면 소송 걸 수도 있음.