[Unity] 문명 개발 일지 03. 유닛 생산과 도시 영역 표시

    도시에서 유닛 생산하는 기능과 도시의 영역을 표시하는 작업을 진행하였다.

    유닛생산

    유닛을 생산하기 위해서는 도시의 생산력, 유닛을 생산하기위한 필요 생산량 정보가 있어야 했다. 도시의 생산력은 도시 데이터에 바로 담았다. 추후 도시의 레벨이라던지 도시에 새워진 건물 보너스 등으로 인해 계산되어질수 있도록 할 예정이다. 유닛의 필요 생산량정보는 별도의 유닛 테이블 클래스를 만들어 유닛의 스탯정보 및 생산정보를 담았다.

    포스트 프로세스 적용

    패키지 매니저에서 Post Processing 을 임포트 해서 패키지를 적용하였고, 볼륨과 레이어를 설정해서 테스트를 하였다. 우선은 화면의 밝기만 조절하고자 Color Grading 만 설정하였다.

    도시 영역 표시

    URP로 전환

    도시의 영역표시를 타일의 아웃라인으로 처리하고자 하였다. 아웃라인 강좌가 셰이더 그래프로 강의하기에 URP를 설치하였다. 그러나 기존 애셋들의 머터리얼이 제대로 동작하지 않고 일괄 변경 기능이 있지만 애셋을 로드할때 마다 변경을 해줘야하는점이 번거로워서 URP전환 하지 않도록 하였다.

    오브젝트로 표시

    헥사타일 변마다 하나의 외곽선을 나타내는 오브젝트를 추가하여 총 6개의 오브젝트를 추가하였다. 인접해 있는 타일이 도시 영역인지 체크하고 없으면 해당 변의 외곽선이 노출되도록 하였다.

    궁수 캐릭터 추가

    전사 말고 궁수 캐릭터를 추가하였다. UnitData및 UnitTable에 궁수캐릭터용 데이터를 채우고 적절한 모델링과 애니메이션을 적용하였다.

    화살 구현

    활 오브젝트를 추가하여 공격 애니메이션 특정 타이밍에 활 오브젝트를 생성하여 타겟 오브젝트에게 날라가도록 작업하였다. 활의 포물선 이동을 위해서 y값만 별도로 계산 하였다.

        void Update()
        {
            if(true == m_bStart)
            {
                float calcTime = (Time.time - m_StartTime) / m_Duration;
    
                Vector3 calPos = m_StartPos + (m_TargetPos - m_StartPos) * calcTime;
                calPos.y = m_TargetPos.y + m_Height * (1 - (Mathf.Abs(0.5f - calcTime) / 0.5f) * (Mathf.Abs(0.5f - calcTime) / 0.5f));
    
                gameObject.transform.position = calPos;
    
                Vector3 targetDirection = m_TargetPos - gameObject.transform.position;
                gameObject.transform.rotation = Quaternion.LookRotation(targetDirection);
                if ( Vector3.Distance(gameObject.transform.position, m_TargetPos) < 1.0f)
                {
                    //데미지 처리
                    if( m_Target.TryGetComponent<ObjectController>(out ObjectController targetObjController))
                    {
                        targetObjController.DoDamaged();
                        targetObjController.AddHP(-m_Damage);
                    }
                    //발사체 삭제
                    Destroy(gameObject);
                }
            }
        }
    
        public void Fire(GameObject inTargetObject, int inDamage, float inHeight = 0.0f)
        {
            if( inTargetObject != null)
            {
                m_Target = inTargetObject;
                m_StartPos = gameObject.transform.position;
                m_TargetPos = m_Target.transform.position;
                m_TargetPos.y = gameObject.transform.position.y;
                m_StartTime = Time.time;
                m_Damage = inDamage;
                m_Height = inHeight;
                m_bStart = true;
            }
        }

    요약

    • 유닛 생산처리
    • 포스트 프로세스 적용
    • 도시 영역 표시를 위해 URP 전환 시도 했다가 롤백 후 오브젝트 표시
    • 원거리 캐릭터 추가
    반응형

    댓글

    Designed by JB FACTORY