Study] Photon Cloud(Unity)-15
- 김영호
- 2023년 2월 3일
- 2분 분량
최종 수정일: 2023년 4월 25일
지난 게시글에 적기가 클라이언트별로 다르게 움직이던 문제가 있었다.
이를 해결하기 위해 적기 Prefab에 "Photon Transform View" Component를 추가하고, 스크립트에서 Move 함수를 "PhotonNetwork.IsmasterClient"를 조건을 걸어 Master 클라이언트에서만 움직이고, 다른 클라이언트에서는 Photon을 통해 움직임을 받아오는 것으로 해결하였다.
다만 원격으로 데이터를 받다보니 약간의 딜레이가 발생한다.
이를 해결 하기 위해 적은 데이터를 전송해 같은 동작을 하도록 하게 할 수 있다.
RPC 함수로 State 변경하기
public class Ayako : Shooter
{
...
...
...
protected override void Move()
{
Vector2 direction = Vector2.zero;
switch (state)
{
case State.DOWN:
direction = Vector2.down;
//마스터 검사 추가
if(PhotonNetwork.IsMasterClient)
if (transform.position.y <= 2.0f + yOffset)
//Down limit 2f, RPC 함수로 동작
photonView.RPC("ToLeftState", RpcTarget.All);
break;
case State.LEFT:
direction = Vector2.left;
//마스터 검사 추가
if (PhotonNetwork.IsMasterClient)
if (transform.position.x <= -1.7f)
//Left limit -1.7f, RPC 함수로 동작
photonView.RPC("ToRightState", RpcTarget.All);
break;
case State.RIGHT:
direction = Vector2.right;
//마스터 검사 추가
if (PhotonNetwork.IsMasterClient)
if (transform.position.x >= 1.7f)
//Right limit 1.7f, RPC 함수로 동작
photonView.RPC("ToLeftState", RpcTarget.All);
break;
}
transform.Translate(direction * speed * Time.deltaTime);
}
[PunRPC]
void ToLeftState()
{
state = State.LEFT;
}
[PunRPC]
void ToRightState()
{
state = State.RIGHT;
}
}
움직이는 방향을 지시하는 State를 바꾸는 부분을 RPC 함수로 변경
Test

그러면 움직이는 함수는 동일하게 작동되고, 움직이는 방향만 Master에서 RPC 함수로 변경해주니 딜레이가 적어지는 것 또한 확인할 수 있다.
이제 실제로 총을 쏴서 적기를 파괴를 구현하기 위해 간단하게 Shooter와 총알에 Collider2D와 Rigidbody2D를 추가하고, Tag "Laser"를 총알에 추가한뒤, 적기의 HP를 깎아 0보다 작아지면 파괴하도록 준비했다.
Destroy Enemy
public class Ayako : Shooter
{
...
...
...
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Laser")
{
Destroy(other.gameObject);
if (PhotonNetwork.IsMasterClient)
{
hp -= 20f;
if (hp <= 0)
photonView.RPC("Dead", RpcTarget.All);
}
}
}
[PunRPC]
void Dead()
{
//Destroy
Destroy(gameObject);
}
}
Photon Cloud 상에서 모든 클라이언트에서 생성되는것을 했던 것처럼 모든 클라이언트에서 파괴하기 위해 PhotonNetwork.Destroy()나 RPC 함수를 사용해 파괴 할 수 있다.
Test