251201

2025. 12. 1. 13:11·📖TIL
using UnityEngine;
using UnityEngine.Android;

public class PermissionManager : MonoBehaviour
{
    private void Start()
    {
        Request(Permission.FineLocation);
    }

    public void Request(string targetPermission)
    {
        // Permission 구조체는 유니티에서 제공해줌
        // 입력받은 종류의 권한이 이미 승인이 되어 있다면?

        if(Permission.HasUserAuthorizedPermission(targetPermission))
        {
            OnSuccess("이미 권한 있었다고 합니다");
            return;
        }

        // 승인 되어있지 않으면? , 여기서부터 핵심

        // 권한 처리 ( 승인 , 거절 , 강한거절 ) 시 반응 ( 콜백 ) 에 대한 정보를 담는 변수 선언
        var pCallback = new PermissionCallbacks();

        // 성공시 해야 할 메서드 등록
        pCallback.PermissionGranted += OnSuccess;

        // 실패 시 해야 할 메서드 등록
        pCallback.PermissionDenied += OnDenied;

        // Permission 구조체에서 권한 요청 보내는 기능을 수행한다
        Permission.RequestUserPermission(targetPermission, pCallback);

        // 예시 : Permission.RequestUserPermission("com.android.permission.ACCESS_LOCAL_POSITION"); 등등
    }

    // 승인 시 , 해야할 행동
    public void OnSuccess(string str)
    {
        Debug.Log(str + "뭔가 성공 메세지");
        // 권한 받은 이후로 해야 할 기능을 여기에 작성
    }

    public void OnDenied(string str)
    {
        Debug.Log(str + "뭔가 실패 메세지");
        // 권한 거부 당했을 때
    }
}

using UnityEngine;
using System.Collections;
using Unity.VisualScripting;

public struct EarthPos
{
    public float Lat { get; set; }
    public float Lng { get; set; }
}

public class GPSManager : MonoBehaviour
{
    private EarthPos _pos = new EarthPos();

    [SerializeField] private float _coroutineCycle = 1;
    private WaitForSeconds _cycle;
    private Coroutine _gpsCor;

    private void Awake()
    {
        _gpsCor = null;
        _cycle = new WaitForSeconds(_coroutineCycle);
    }

    public void GpsOn()
    {
        if (_gpsCor != null)
        {
            return;
        }
        _gpsCor = StartCoroutine(GpsCoroutine()); // GPS 키는 루틴
    }

    public void GpsOff()
    {
        if (_gpsCor == null)
        {
            return;
        }
        StopCoroutine(_gpsCor);
        _gpsCor = null;
    }

    private IEnumerator GpsCoroutine()
    {
        // 1. 디바이스가 GPS를 사용 중이 아니라면 동작을 정지한다
        if (!Input.location.isEnabledByUser)
        {
            yield break;
        }

        // 2. GPS를 시작한다
        Input.location.Start(); // 진짜로 GPS 켠다

        // 3. GPS 준비 대기
        int waitCount = 20; // 임의로 적은 값

        while (true)
        {
            if (Input.location.status == LocationServiceStatus.Initializing)
            {
                yield return _cycle;
                waitCount--;

                // 20회 이상 Init 이 수행되고 있다면?
                if (waitCount <= 0)
                {
                    Input.location.Stop();
                    yield break;
                }
            }
            else if (Input.location.status == LocationServiceStatus.Failed)
            {
                Input.location.Stop();
                yield break;
            }
            else if (Input.location.status == LocationServiceStatus.Running)
            {
                break;
            }
            
            // 4. 위 모든 단계를 전부 통과했다면 (정상 구동 시)
            // 일정 주기마다 (위도 경도를 갱신)
            while (true)
            {
                // 마지막으로 갱신된 최신 데이터를 가져와서 로케이션에 담는다
                LocationInfo _location = Input.location.lastData;
                _pos.Lat = _location.latitude;
                _pos.Lng = _location.longitude;
                yield return _cycle;
            }
        }
    }
}
using UnityEngine;
using UnityEngine.Android;

public class PermissionManager : MonoBehaviour
{
    [SerializeField] GPSManager myGps;

    private void Start()
    {
        Request(Permission.FineLocation);
    }

    public void Request(string targetPermission)
    {
        // Permission 구조체는 유니티에서 제공해줌
        // 입력받은 종류의 권한이 이미 승인이 되어 있다면?

        if(Permission.HasUserAuthorizedPermission(targetPermission))
        {
            OnSuccess("이미 권한 있었다고 합니다");
            return;
        }

        // 승인 되어있지 않으면? , 여기서부터 핵심

        // 권한 처리 ( 승인 , 거절 , 강한거절 ) 시 반응 ( 콜백 ) 에 대한 정보를 담는 변수 선언
        var pCallback = new PermissionCallbacks();

        // 성공시 해야 할 메서드 등록
        pCallback.PermissionGranted += OnSuccess;

        // 실패 시 해야 할 메서드 등록
        pCallback.PermissionDenied += OnDenied;

        // Permission 구조체에서 권한 요청 보내는 기능을 수행한다
        Permission.RequestUserPermission(targetPermission, pCallback);

        // 예시 : Permission.RequestUserPermission("com.android.permission.ACCESS_LOCAL_POSITION"); 등등
    }

    // 승인 시 , 해야할 행동
    public void OnSuccess(string str)
    {
        Debug.Log(str + "뭔가 성공 메세지");
        myGps.GpsOn();
    }

    public void OnDenied(string str)
    {
        Debug.Log(str + "뭔가 실패 메세지");
        myGps.GpsOff();
    }
}
using UnityEngine;
using TMPro;

public class TestText : MonoBehaviour
{
    [SerializeField] TextMeshProUGUI lat;
    [SerializeField] TextMeshProUGUI lng;
    [SerializeField] GPSManager myGps;

    private void Update()
    {
        lat.text = myGps._pos.Lat.ToString();
        lng.text = myGps._pos.Lng.ToString();
    }
}

 

'📖TIL' 카테고리의 다른 글

251203  (0) 2025.12.03
251202  (0) 2025.12.02
251122  (0) 2025.11.22
쉐이더 그래프 & 상태 패턴  (0) 2025.11.20
251120  (0) 2025.11.20
'📖TIL' 카테고리의 다른 글
  • 251203
  • 251202
  • 251122
  • 쉐이더 그래프 & 상태 패턴
DevHoChan
DevHoChan
맨땅에서 시작하는 코딩 도전
  • DevHoChan
    Debugging Life
    DevHoChan
  • 전체
    오늘
    어제
    • 분류 전체보기 (374)
      • 🕹️Game Life (1)
      • 🖥️Computer Science (5)
      • 📖TIL (141)
        • 🔥Projects (16)
        • 💡DevTips (5)
        • 🤔발생한 문제와 해결 (5)
        • 🔮Unity Graphics (5)
        • 🎤Interview (3)
        • ✅CodingTest (9)
      • 🚀Game Release (4)
      • 🧊Unity Basic (58)
        • 📌용어 사전 (1)
        • 에디터&인터페이스 (3)
        • 디버그 (1)
        • 라이프사이클 (4)
        • 게임오브젝트 (4)
        • 프리팹 (1)
        • 오브젝트풀링 (4)
        • 애트리뷰트 (2)
        • 트랜스폼 (4)
        • 물리&충돌 (1)
        • 프레임&델타타임 (4)
        • 코루틴&이벤트 (7)
        • 수학&보정함수 (3)
        • 디자인패턴 (9)
        • UGUI (3)
        • 벡터 ( Vector ) (3)
        • 씬 ( Scene ) (2)
        • 데이터 관리 (2)
      • ⭐C Sharp (99)
        • 📌용어 사전 (1)
        • 📌문법 사전 (6)
        • 메모리 관리 (3)
        • 00. 문법 (17)
        • 01. 변수 (3)
        • 02. 자료형 (2)
        • 03. 연산자 (6)
        • 04. 조건문 (2)
        • 05. 반복문 (2)
        • 06. 배열 (3)
        • 07. 메서드(함수) (7)
        • 08. 열거형 (3)
        • 09. 구조체 (2)
        • 10. 참조 (2)
        • 11. 객체 지향 (11)
        • 12. 델리게이트 (3)
        • 13. 디자인 패턴 (7)
        • 14. LINQ (1)
        • 📂▼자료구조 (2)
        • 15-1. 제네릭 (3)
        • 15-2. 배열 (4)
        • 15-3. 리스트 (2)
        • 15-4. 스택과 큐 (2)
        • 15-5. 딕셔너리 해시테이블 (2)
        • 15-6. 트리와 그래프 (3)
      • 📊Algorithm (16)
        • BigO (2)
        • 정렬 (4)
        • 셔플 (2)
        • 탐색 (6)
        • 최적화 (1)
      • 📝Game Design (16)
      • 🤖​AI Tools (12)
        • AI 리뷰 분석 (6)
        • Player2 (0)
        • 3D 모델링 (1)
        • 2D 스프라이트 (0)
        • 이미지 (2)
        • 사운드 (1)
        • 동영상 (1)
        • 문서 (1)
      • 🌍Network (6)
      • 🌱Github (11)
        • 기본 개념 (7)
        • 명령어 (1)
        • 도구 활용 (1)
      • ⚙️Visual Studio (5)
        • 🔧설치 및 환경설정 (2)
        • ⌨️HotKey (1)
        • 🚨디버깅 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    디자인패턴
    c#
    객체지향
    CodingTest
    자료구조
    til
    OOP
    기획
    자료형
    메모리관리
    게임기획
    algorithm
    부트캠프
    유니티
    문법
    gamedesign
    게임디자인
    GitHub
    csharp
    unity
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
DevHoChan
251201
상단으로

티스토리툴바