
오늘 학습 키워드
최종 팀 프로젝트, 회사 생활 전에 알아두면 좋을 것들들
오늘 학습 한 내용을 나만의 언어로 정리하기
메테오 발사체 만들기 (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세 이후에 찾으면 비과세
- 중간에 찾을 수 있지만 그동안 쌓인 수익(이자)에 세금이 적용되면서 퇴직금 세일 돌입
- 퇴직금의 중간 정산
- 회사 다니면서도 퇴직금은 받을 수 있음
- 고용노동부가 정한 특정한 경우(주택 구입, 부양 가족의 장기 부상/질병, 파산선고, 개인 회생 절차 등)에만 가능
- 퇴직금을 받으려면 1년 이상 근무해야 함
억울함에서 건져줄 팁
- 언제 어디서나 기록은 중요하다.
- 기획을 했다면 기획서, 근무를 했다면 근태기록으로.
- 외부와 소통할 때 중요한 것
- 채팅 기록
- 이메일
- 통화 기록
- 상대의 동의를 구하고 하세요!!!!
- 통화를 미팅 형식으로 진행했다면 미팅 내용을 정리해서 이메일(or 채팅)으로 반드시 공유 할 것
- 레퍼런스 체크 : 회사 생활을 상식적으로 해야 하는 이유
- 늘 레퍼체크를 하지는 않음
- 다만 규모가 큰 회사거나 인재 채용에 신중한 회사 일수록 레퍼런스 체크를 하는 경우가 많음.
이직 하기 좋은 타이밍
- 무조건 경력 1년은 채우고 나오셈.
- 경력 1년 이하는 경력자로 대우받기 애매한 경우가 많음
- 가장 이상적인 첫 경력 이직 타이밍
- 2~3년차
- 4~5년차
- 프로젝트 경험도 있고, 회사 돌아가는거 알고, 몸값이 글케 비싸진 않은데 일은 잘할 확률 높음
- 물론 재직 중인 회사에 만족 중이라면 억지로 이직할 필요는 없음
- 생각보다 이직은 스트레스가 많음
- 잦은 이직은 오히려 해로운 경우도 있음
그 외 팁
- 법인의 피고용인으로서 일을 하게 될 경우 법인의 사업 결과와 그 책임을 피고용인에게 물을 수 없음.
- ⇒ 프로젝트를 망해도 우리의 책임은 아님.
- 다만 본인의 실수 or 고의로 회사에게 금전적 피해를 입히거나 명예를 훼손한다면 소송 걸 수도 있음.