안녕하세요 요즘 장마철이 끝나지 않고 비가 계속 쏟아지는데 답답하네요 ㅎㅎ 새로운 동내로 이사 와서 첫 주말 자전거 타고 둘러보려 했는데 아쉽네요 그런 관계로 안드로이드 플러그인 사용에 대해 알려드리겠습니다!
저는 처음 사용할 때는 삽질을 많이 했지만 여러분은 간단히 되길 바라면서 시작해보겠습니다.
우선 안드로이드 프로젝트를 만들어 주시기 바랍니다.
empty Activity 로 하셔도 되고
No Activity를 하셔도 무방합니다.
저는 일단 처음에는 안드로이드에서 만든 메서드를 사용해보고 잘 되는지 확인하기 위해서 Empty Activity로 시작해서 실제 구동되는지 확인하고 넘어갔었습니다.
다음 화면입니다.
여기서 주의하셔야 할 것은 Minimum SDK 입니다.
그 이유는 유니티에서도 Minimum SDK를 설정하는데 안드로이드 Minimum과 유니티 Minimum이 일치하지 않으면 오류가 생기게 됩니다. 잘 기억해두셨다가 유니티에서도 같게끔 설정해주세요
유니티 프로젝트가 성공적으로 생성되고 gradle 파일들도 성공적으로 빌드되었다면 File -> New -> New Module로 들어가 모듈을 생성해줍니다. 타입은 Android Library로 선택해주세요
모듈이 생성되면 androidTest, test 파일을 지워주세요 저는 진행하다 까먹어서 후에 지웠습니다. 이 파일들이 같이 있으면 중복으로 오류가 생길 수도 있답니다.
생성된 모듈에 클래스를 생성해주세요. 저는 test_String으로 만들겠습니다.
아래의 이미지와 같이 문자열 반환 메소드를 만들었습니다. 우선 플러그인이 되는지 확인을 위해 간단한 문자열 반환 함수만 사용하겠습니다. 기본적으로 함수를 static을 붙여서 만든 이유는 static을 안 붙이고 유니티에서 호출하면 호출이 되질 않습니다. static을 안 붙이고 사용하려고 하신다면 싱글턴 패턴을 이용하셔야 합니다. 다음 글에서 다루겠습니다.
이제 Build -> Make Module '모듈명' 을 클릭해주세요
그다음으로, 생성한 모듈을 우클릭하여 Show in Explorer을 선택해서 폴더를 엽니다.
mylibrary를 클릭(본인의 모듈명)
outputs를 클릭
aar을 클릭
aar 파일이 만들어 진 것을 볼 수 있습니다.
이 파일을 이용해서 유니티에서 안드로이드에서 구현된 메서드를 사용할 수 있도록 할 수 있습니다.
이제 유니티로 넘어가겠습니다.
유니티 프로젝트를 생성해주세요
생성되었다면, 위 탭 창에서 File -> Build Setting 을 클릭해주세요
플랫폼을 Android로 설정해주세요.
다음으로, Player Setting... 을 클릭해서 Other Setting에있는 Identification에서 Minimum API Level을 안드로이드 Minimum SDK 레벨과 동일하게 설정해주세요 중요합니다.
다음으로 위로 올리면 Company Name이 있습니다. DefaultCompany로 남겨두지 마시고 다른 아무 이름이나 원하는 이름으로 변경해주세요
다음으로 폴더를 생성하겠습니다.
Assets -> Plugins -> Android 순으로 폴더를 제작해주세요.
그곳에 아까 만들어둔 aar 파일을 넣어주세요
이제 Assets 폴더에다 C# 스크립트를 제작하도록 하겠습니다. 코드는 일단 아래 이미지와 같이 만들어 주세요
코드를 보면 new AndroidJavaClass(""); 부분에 보면 빈 문자열을 넣고 있습니다.
안드로이드 프로젝트로 돌아가서 패키지 경로를 확인해주세요
저 같은 경우 com.example.mylibrary라고 돼있는 것을 확인할 수 있습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class NewBehaviourScript : MonoBehaviour
{
private AndroidJavaObject UnityInstance;
[SerializeField] private Text text;
// Start is called before the first frame update
void Start()
{
AndroidJavaClass ajc = new AndroidJavaClass("com.example.mylibrary.test_String");
string str = ajc.CallStatic<string>("returnString");
text.text = str;
}
}
ajc.CallStatic은 스태틱 메서드를 호출할 때 사용합니다.
ajc.Call 은 일반 메소드를 호출할 때 사용합니다.
Call로 호출을 원한다면 static으로 선언된 싱글턴 메서드를 호출한 후 생성된 Instance를 통해 가능합니다.
아래와 같이 객체를 생성하여 주시기 바랍니다.
PluginManager는 엠티 오브젝트입니다.
플로그인 매니저에 방금 만든 스크립트를 넣어주고 Text에 Text를 드래그 앤 드롭해주세요 무슨 말인지 알죠?
UI text 사이즈를 위와 같이 키우고 폰트 사이즈를 50 정도로 맞춘 다음 글자를 가운데 맞춤을 해주세요
성공적이네요 ㅎㅎ 위 이미지는 모바일에서 구동된 이미지입니다. 그냥 유니티 환경에서 플레이 하면 문자열이 보이지 않게 되네요
일단 간단하게 유니티 플러그인을 실수 없이 만들 수 있도록 구현해보았습니다.
하지만 유니티에서 안드로이드를 사용하고 싶다는 것은 모바일 기능을 이용하고 싶다는 것일 것입니다.
그러면 유니티로 안드로이드 Context를 불러와서 사용해야 하거나 권한 설정을 해야 할 수 있습니다. 그 점에 대해서는 다음 글에서 다루겠습니다. 수고하셨습니다~
GTP : GPRS Tunneling Protocol -> GPRS 를 전달하는 IP 기반 통신 프로토콜 그룹
GPRS(General Packet Radio Service)
Tunneling : 터널을 파고 나가는
GTP-C : GTP Control
GTP-U : GTP User
HSS : Home Subscriber Server
사용자 프로파일을 갖는 중앙 DB로 MME에게 사용자 인증 정보와 사용자 프로파일을 제공한다.
HomeSubscriberServer(HSS)는 IPMultimediaSubsystem(IMS)내에서 사용된 주 가입자 데이터베이스이며 네트워크 내 다른 엔터티에 대한 가입자의 세부 정보를 제공합니다.IMS를 통해 사용자는 상태에 따라 다른 서비스에 대한 액세스를 허용하거나 거부할 수 있습니다.
IP : Internet Protocol
LTE : Long Term Evolution
HSDPA 보다 한층 진화된 휴대전화 고속 무선 데이터 패킷통신규격이다. HSDPA의 진화된 규격인 HSPA+와 함께 3.9세대 무선통신규격으로 불린다.
MAC : Medium Access Control
MME : Mobility Management Entity
- E-UTRAN 제어 평면 엔터티로, 사용자 인증과 사용자 프로파일 다운로드를 위하여 HSS와 통신하고, NAS 시그널링을 통해 UE에게 EPS 이동성 관리(EMM) 및 EPS Session 관리(ESM)기능을 제공한다.
- LTE 망의 "두뇌" 역할을 하는 장비 그 역할은 UE를 인증(Authentication) , EPS 베어러를 관리 , 가입자의 Mobility 상태를 관리
NAS : Non Access Stratum
NAS는 UMTS 프로토콜 스택에서 UE와 코어 네트워크간의 시그널링, 트래픽 메시지를 주고 받기 위한 기능적인 계층이다. NAS 영역의 하부에는 Mobile Management영역이, 상부에는 Communication Management영역이 있다.
from 위키백과
NRM : Network Reference Model
각 형태의 통신망들이 네트워크 구조 각 구성요소별로 쉬운 참조 및 이해를 돕기위해, 해당 네트워크를 기능적으로 구분시킨 기능 블럭 다이어그램을 말함
S-GW(Serving Gateway) : E-UTRAN과 EPC의 종단점이 된다. eNB 간 핸드오버 및 3GPP 시스템 간 핸드오버시 anchoring point가 된다.
P-GW(Packet Data Network Gateway) : UE를 외부 PDN망과 연결해주며 패킷 filtering을 제공한다. UE에게 IP 주소를 할당하고 3GPP와 non-3GPP 간 핸드 오버시 mobility anchoring point로 동작한다. PCRF로부터 PCC 규칙을 수신하여 적용하며 (Policy Enforcement) UE 당 과금 기능을 제공한다. 주요 기능은 다음과 같다.
- IP 라우팅 및 fowarding
- Per-SDF / Per-User 기반 패킷 filtering
- UE IP 주소 할당
- 3GPP와 non-3GPP 간 Mobility anchoring
- PCEF 기능
- Per-SDF/Per-User 과금
참조점
프로토콜
설명
LTE-Uu
E-UTRA (제어 평면, 사용자 평면)
UE와 eNB 간 무선 인터페이스로 제어 평면 및 사용자 평면을 정의한다.
X2
X2-AP (제어 평면) GTP-U (사용자 평면)
두 eNB 간 인터페이스로 제어 평면 및 사용자 평면을 정의한다.
S1-U
GTP-U
eNB 와 S-GW 간 인터페이스로 사용자 평면을 정의한다. 베어러 당 GTP 터널링을 제공한다.
S1-MME
S1-AP
eNB와 MME 간 인터페이스로 제어 평면을 정의한다.
S11
GTP-C
MME와 S-GW 간 인터페이스로 제어 평면을 정의한다. 사용자 당 GTP 터널링을 제공한다.
S5
GTP-C(제어 평면) GTP-U(사용자 평면)
S-GW와 P-GW간 인터페이스로 제어 평면 및 사용자 평면을 정의한다. 사용자 평면에서 베어러 당 GTP 터널링을 제공하고 제어 평면에서 사용자 당 GTP 터널 관리를 제공한다.
S6a
Diameter
HSS와 MME 간 인터페이스로 제어 평면을 정의한다. UE 가입 정보 및 인증 정보를 교환한다.
Sp
Diameter
SPR과 PCRF 간 인터페이스로 제어 평면을 정의한다.
Gx
Diameter
PCRF와 P-GW간 인터페이스로 제어 평면을 정의한다. QoS 정책 및 과금 제어를 위한 인터페이스로 정책 제어 규칙 및 과금 규칙을 전달한다.
Gy
Diameter
OCS와 P-GW 간 인터페이스로 제어 평면을 정의한다.
Gz
GTP'
OFCS와 P-GW간 인터페이스로 제어 평면을 정의한다.
SGi
IP
P-GW와 PDN 간 인터페이스로 사용자 평면과 제어 평면을 정의한다. 사용자 평면에서는 IETF 기반 IP 패킷 forwarding 프로토콜이 사용되고 제어 평면에서는 DHCP와 RADIUS/Diameter와 같은 프로토콜이 사용된다.
핸드오버 : 핸드오버는 단말기가 연결된 기지국의 서비스 공간에서 다른 기지국의 서비스 공간으로 이동할 때, 단말기가 다른 기지국의 서비스 공간에 할당한 통화 채널에 동조하여 서비스가 연결되는 기능을 일컫는다. from 위키백과
OCS : Online Charging System
- 실시간 credit 제어를 제공하고 volume, time, event 기반 과금 기능을 제공한다.
- 온라인 과금 시스템 은 통신 서비스 공급자가 고객의 실시간 서비스 사용기반 과금을 할 수 있도록 하는 시스템이다.
from 위키백과
OFCS : Offline Charging System
- CDR 기반 과금 정보를 제공한다.
- OFCS 는 오프라인 거래 시스템의 핵심 요소이다. OFCS 는 MSC, SGSN, CSCF등 잠재적으로 거래 관련 데이터를 제공하는 인터넷 노드들과 상호작용한다.
OSS : Operations Support System
운용 지원 시스템은 통신 서비스 제공자가 자사의 네트워크를 관리하기 위해 사용하는 컴퓨터 시스템이다. 네트워크 재고, 서비스 프로비저닝, 네트워크 구성, 장애 관리 등의 관리 기능을 지원한다. 사업 지원 시스템과 더불어 다양한 단대단 통신 서비스들을 지원하기 위해 사용된다. from 위키백과
PCC : Policy and Charging Control
정책 및 과금 제어
PCEF : Policy and Charging Enforcement Function
PCEF는 정책 및 청구 기능에서 수신한 결정을 시행하고 PCRF에 백 엑세스 및 및 가입자 정보를 중계하도록 설계 되었다.
PCRF : Policy and Charging Rule Function
정책 및 과금 제어 엔터티로 정책 제어 결정과 과금 제어 기능을 제공한다. PCRF에서 생성된 PCC 규칙은 P-GW로 전달된다.
정책 및 청구 규칙 기능은 멀티미디어 네트워크에서 정책 규칙을 결정하기 위해 실시간으로 지정된 소프트웨어 노드입니다. 정책 도구로서 PCRF는 차세대 네트워크에서 중심적인 역할을합니다. from 위키백과
PDCP : Packet Data Convergence Protocol
PDCP는 UMTS내 무선 트래픽 스택의 계층 중 하나이며, IP 헤더 압축 및 압축 해지, 사용자 데이터의 전송, Radio Bearer에 대한 시퀀스 번호 유지를 수행한다. 압축 기술은 RFC 2507 또는 RFC 3095에 기반한다.
Convergence : 수렴
PDN : Packet Data Network
공공 데이터 네트워크는 일반 대중을위한 데이터 전송 서비스를 제공하기 위해 통신 관리 부서 또는 공인 된 개인 운영 기관에서 설정하고 운영하는 네트워크입니다.
QoS : Quality of Service
QoS는 다른 응용 프로그램, 사용자, 데이터 흐름 등에 우선 순위를 정하여, 데이터 전송에 특정 수준의 성능을 보장하기 위한 능력을 말한다.
RLC : Radio Link Control
무선 링크 제어는 공중 인터페이스에서 UMTS 및 LTE에 사용되는 계층 2 무선 링크 프로토콜입니다. 이 프로토콜은 UMTS의 TS 25.322, LTE의 TS 36.322 및 5G New Radio의 TS 38.322에서 3GPP로 지정됩니다. from 위키백과
RRC : Radio Resource Control
무선 자원 제어 프로토콜은 무선 인터페이스의 UMTS 및 LTE에서 사용됩니다. UE와 eNB 사이에 존재하며 IP 레벨에 존재하는 계층입니다. 이 프로토콜은 UMTS의 경우 TS 25.331 및 LTE의 경우 TS 36.331에서 3GPP로 지정됩니다.
RRM : Radio Resource Management
무선 자원 제어 프로토콜은 무선 인터페이스의 UMTS 및 LTE에서 사용됩니다. UE와 eNB 사이에 존재하며 IP 레벨에 존재하는 계층입니다. 이 프로토콜은 UMTS의 경우 TS 25.331 및 LTE의 경우 TS 36.331에서 3GPP로 지정됩니다. 위키백과
S1AP : S1 Application Protocol
S1애플리케이션 프로토콜(S1AP)은 E-UTRAN과 진화된 패킷 코어(EPC)사이에서 제어부 신호 전달을 제공합니다.
SCTP : Stream Control Transmission Protocol
스트림 제어 전송 프로토콜은 컴퓨터 네트워킹에서 프로토콜 번호 132를 사용하는 전송 계층 프로토콜의 하나로서, 잘 알려진 프로토콜인 전송 제어 프로토콜, 사용자 데이터그램 프로토콜와 비슷한 역할을 수행한다. TCP와 UDP의 동일한 서비스 기능들 가운데 일부를 제공한다.
SDF : Service Data Flow
통화와 관련된 음성 패킷의 흐름이나 웹 사이트에서의 스트리밍 데이터와 같은 가입자에게 제공되는 서비스를 나타내는 패킷의 흐름을 설명합니다.
SN : Sequence Number
시퀸스 넘버
SPR : Subscriber Profile Repository
- PCR에게 가입자 및 가입관련 정보를 제공한다. PCRF는 이를 수신하여 가입자 기반 정책을 수행하고 과금 규칙을 생성한다.
- 3GPP 표준에 따라 정의된 가입자별 정책 제어 데이터를 저장 및 관리하는 시스템이다.
TEID : Tunnel Endpoint Identifier
TEID는 수신 GTP-U(GPRS터널링 프로토콜-사용자)또는 GTP-C(GPRS터널링 프로토콜-제어)프로토콜 실체에서 터널 끝점을 명확하게 식별합니다.GTP터널의 수신 측은 전송 측에서 사용할 TEID값을 로컬로 할당합니다.TEID값은 GTP-C메시지(또는 IMT-2000지상파 무선 액세스 네트워크의 RANAP)를 사용하여 터널 엔드 포인트 간에 교환된다.
UE : User Equipment
- LTE-Uu 무선 인터페이스를 통하여 eNB와 접속한다.
- User Equipment는 정보통신 용어의 하나로 5G 서비스가 제공되는 통신대상 단말의 수를 의미한다. UE Speed는 서비스가 제공되는 통신 대상 지역에 위치한 단말의 이동속도를 의미한다. from 위키백과
eNB Evolved Node B
사용자에게 무선 인터페이스를 제공한다. 무선 베어러 제어, 무선 수락 제어, 동적 무선 자원 할당, load balancing 및 셀 간 간섭제어(ICIC)와 같은 무선 자원 관리(RRM) 기능을 제공한다.
evolved : 진화된
UDP : User Datagram Protocol
transport 계층의 통신 프로토콜로, 신뢰성이 낮은 프로토콜로써, 완전성을 보증하지 않으나, 가상회선을 굳이 확립할 필요가 없고, 유연하며 효율적 응용의 데이터 전송에 적합
X2-AP : X2 Application Protocol
X2AP프로토콜은 E-UTRAN내의 UE이동성을 처리하는 데 사용
3GPP는 이동통신 관련 단체들 간의 공동 연구 프로젝트로 국제전기통신연합의 IMT-2000 프로젝트의 범위 내에서 - 전 세계적으로 적용 가능한 - 3세대 이동통신 시스템 규격의 작성을 목적으로 하고 있다.
Diameter
다이어미터 프로토콜은 컴퓨터 네트워크에서 사용되는 인증, 인가 및 과금 프로토콜이다. 다이어미터 프로토콜 보다 앞서 사용된 RADIUS 프로토콜에서 훨씬 더 유용하게 진화되었고 RADIUS 프로토콜을 대체하고 있다. from 위키백과
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class move_arrow : MonoBehaviour
{
public int arrow_pos { get; set; } = 1;
private IEnumerator arrow_trans()
{
while (true)
{
switch (arrow_pos)
{
case 1:
transform.localPosition = new Vector3(-500, 200, -277);
break;
case 2:
transform.localPosition = new Vector3(-290, 200, -277);
break;
case 3:
transform.localPosition = new Vector3(-100, 200, -277);
break;
case 4:
transform.localPosition = new Vector3(90, 200, -277);
break;
case 5:
transform.localPosition = new Vector3(280, 200, -277);
break;
case 6:
transform.localPosition = new Vector3(480, 200, -277);
break;
}
/** 1초 딜레이 **/
yield return new WaitForSeconds(3f);
}
}
private void OnEnable()
{
StartCoroutine(arrow_trans());
}
}
<코드 설명>
transform.position 으로 하지 않고 transform.localPosition으로 한 이유는 객체가 어떤 부모 객체에 속하기 때문이다.
import random
count =0
while True:
rn = random.randint(1, 3)
if rn==1:
com = '가위'
elif rn==2:
com = '바위'
elif rn==3:
com = '보'
player = input("가위, 바위, 보 중 하나를 입력하세요.")
if player =='가위' or player =='보' or player=='바위' :
if (com=='가위' and player== '보') or(com=='바위' and player== '가위') or(com=='보' and player== '바위') :
print('com='+com+' player='+player+' is com win')
elif (com=='보' and player== '가위') or(com=='가위' and player== '바위') or(com=='바위' and player== '보') :
print('com='+com+' player='+player+' is player win')
count += 1
if count >=3 :
print("player가 3승으로 종료합니다.")
break
else :
print('com='+com+' player='+player+' is draw')
else :
print("잘못 입력했습니다.")
continue
가위, 바위, 보 중 하나를 입력하세요.가위
com=바위 player=가위 is com win
가위, 바위, 보 중 하나를 입력하세요.바위
com=가위 player=바위 is player win
가위, 바위, 보 중 하나를 입력하세요.보
com=바위 player=보 is player win
가위, 바위, 보 중 하나를 입력하세요.보
com=보 player=보 is draw
가위, 바위, 보 중 하나를 입력하세요.보
com=가위 player=보 is com win
가위, 바위, 보 중 하나를 입력하세요.가위
com=가위 player=가위 is draw
가위, 바위, 보 중 하나를 입력하세요.보
com=바위 player=보 is player win
player가 3승으로 종료합니다.
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-51-08860365de26> in <module>
----> 1 print(APple)
NameError: name 'APple' is not defined