유니티 태양광패널 디지털 트윈 프로젝트(8) -전라남도 씬 구현 완료(다른 태양광 발전소 찾아 발전량 넣기는 보류)

2024. 2. 29. 14:09Unity

728x90
반응형

전라남도의 주요 발전소를 알아보기 위해서 공공 데이터에 나와있는 정보를 활용한다.

https://www.data.go.kr/data/15029803/fileData.do?recommendDataYn=Y

 

전라남도_신재생에너지 현황_20240223

전라남도내 신재생에너지 발전 상업운전 현황<br/>태양광, 풍력, 소수력, 바이오에너지 등<br/>발전소명, 발전소위치, 사업허가일, 사업개시일, 발전용량 등

www.data.go.kr

 

 

공공 데이터에서 받은 CSV 파일을 열어보면, 태양광 발전을 포함한 신재생에너지 현황이 나열되어있고, 여기서 태양광 발전소만 따로 필터하여 높은 설비용량의 발전소를 보려고 한다.

 

 

위성 지도와 비교해보면서 [솔라시도], [영광 태양광 발전단지], [금전 햇빛 태양광 발전소], [거금 솔라파크] 4개를 배치하는 것이 설비 용량도 있고 분포 되어있는 모양도 괜찮다고 생각했다.

 

 

확정된 위치에 따라 태양광 에셋을 배치하였고, 원과 직선 이미지를 직접 생성하여 지시하는 화살표로 사용했다.

 

 

이름 아래에 일일 발전량 텍스트를 추가하기 위해서 태양광 발전량 구하는 식을 찾아보았다.

https://workingplace.tistory.com/2

 

태양광 발전량 계산방법 2가지 [일사량 & 일조시간]

태양광 발전량 계산방법 - 태양광 발전량 계산방법에는 1.일조시간을 통해 산출하는 방법과 2.일사량을 통해 산출하는 방법이 있음. 1. 지역별 일조시간을 통해 계산하는 방법 - 일일 태양광 발전

workingplace.tistory.com

  1. 일일 태양광 발전량 = 지역별 평균 일일 일사량[kWh/m²/Day] * 태양광 설치 면적 * 태양광 모듈 발전 효율
  2. 일일 태양광 발전량 = 태양광 설치 총 용량 * 일일 발전량(=일일 지역별 일조시간 * 0.6)

 

 

 


 

 

일사량으로 발전량 구하기

 

아래의 링크의 데이터로 하루 일사량을 알 수 있다.

https://kier-solar.org/user/map.do?type=sl

 

자원지도 분석 시스템

검색기능을 활용하여 원하는 지점을 검색할 수 있습니다. (주소검색, 건물검색 가능) 이전 다음

kier-solar.org

광주의 4.12kWh/m²/Day 값을 참고하여 계산하면,

 

솔라시도 : 4.2kWh/m²/Day * (295,493.2m² + 200,621m² + 279,675m² + 284,101.8m²) * 23% = 4,451,565.2kW (4.45GW)

영광 태양광 발전단지 : 4.2kWh/m²/Day * (1,200,000m² + 229,960.5m² + 137,450.4m² + 221,088.7m² + 9,917.4m²) * 23% = 173,727,082.2kW (173.73GW)

금전 햇빛 태양광 발전소

거금 솔라파크

 

발전 면적은 네이버 지도의 면적 구하는 툴로 계산하였다.

 

 

 


 

 

일조시간으로 발전량 구하기

https://www.weather.go.kr/w/obs-climate/land/past-obs/obs-by-element.do

 

과거관측 - 요소별자료 - 기상청 날씨누리

개편된 날씨누리 홈페이지 첫 화면에서 지도를 통한 실시간 기상정보와 레이더영상, 전국 특보 현황을 조회할 수 있으며, 내 지역의 현재 기상상황과 대기질 상태, 일출/일몰 시각을 확인할 수

www.weather.go.kr

 

표에서, 각 월의 일조 시간을 모두 더해서 365로 나누면 일일 일조시간을 알 수 있다.

전남 영광의 일일 평균 일조시간은 5.66hr이다.

 

...발전량이 좀 이상해서 보류...

 

 


 

 

마우스를 올리면 에셋 스케일을 Coroutine을 이용해 천천히 변경하기, 솔라시도 부분 에셋을 누르면 다음 씬으로 넘어가기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class ColliderButton : MonoBehaviour
{
    public Vector3 hoverScale = new Vector3(1.7f, 1.7f, 1.7f);
    public Vector3 hoverPosition = new Vector3(142.07f, -8.2041f, 96.441f);
    public float lerpSpeed = 2f;
    public bool nextScene = false;

    private Vector3 initialScale;
    private Vector3 initialPosition;

    // 현재 실행 중인 코루틴을 추적하기 위한 참조 변수 추가
    private Coroutine lerpCoroutine;

    private void Start()
    {
        initialScale = transform.localScale;
        initialPosition = transform.localPosition;
    }

    private void OnMouseEnter()
    {
        Debug.Log("마우스 호버");
        // 중지된 코루틴이 있다면 중지
        if (lerpCoroutine != null)
        {
            StopCoroutine(lerpCoroutine);
        }
        // 크기를 키우는 코루틴 시작
        lerpCoroutine = StartCoroutine(LerpScale(hoverScale, hoverPosition));
    }

    private void OnMouseExit()
    {
        // 중지된 코루틴이 있다면 중지
        if (lerpCoroutine != null)
        {
            StopCoroutine(lerpCoroutine);
        }
        // 크기를 줄이는 코루틴 시작
        lerpCoroutine = StartCoroutine(LerpScale(initialScale, initialPosition));
    }

    private IEnumerator LerpScale(Vector3 targetScale, Vector3 targetPosition)
    {
        float elapsedTime = 0f;
        Vector3 startingScale = transform.localScale;
        Vector3 startingPosition = transform.localPosition;

        while (elapsedTime < lerpSpeed)
        {
            transform.localScale = Vector3.Lerp(startingScale, targetScale, elapsedTime / lerpSpeed);
            transform.localPosition = Vector3.Lerp(startingPosition, targetPosition, elapsedTime / lerpSpeed);
            elapsedTime += Time.deltaTime;
            yield return null;
        }

        transform.localScale = targetScale; // Ensure the target scale is reached
        transform.localPosition = targetPosition;
    }

    private void OnMouseDown()
    {
        if(nextScene == true)
        {
            SceneManager.LoadScene(2);
        }
    }
}

 

위의 스크립트를 작성하고 지역 별 에셋에 넣으면, 마우스를 에셋 위에 올렸을 때 스케일이 변화한다.

코루틴 실행 중에도 마우스를 올렸다 내렸다하면 해당 코루틴을 즉시 중지하고 다른 코루틴이 실행되도록 수정하였다.

솔라시도 부분을 누르면 솔라시도 씬 화면으로 넘어간다.

728x90
반응형