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();
}
}