[PunRPC]ย ย ย
public void SetGun(int gunToSwitchTo)
{
}
photonView.RPC("SetGun",RpcTarget.All,selectedGun);
์์ ํจ์๋ ์์ ์ ํด๋ผ์ด์ธํธ PC1์์ RPC ํจ์๋ฅผ ์ ์คํํด์, PC2์ ์์ ์ ์บ๋ฆญํฐ์๊ฒ ์ด์ด ๋ฐ๋ ๊ฒ์ ์ ์ ๋ฌ ํฉ๋๋ค.
[PunRPC]
public void DealDamage(string damager, int damageAmount, int actorNumber)ย ย
{
ย ย ย if (photonView.IsMine)
ย ย ย {
ย ย ย ย ย ย
ย ย ย }
}
hit.collider.gameObject.GetPhotonView().RPC("DealDamage",RpcTarget.All,photonView.Owner.NickName,allGuns[selectedGun].shotDamage,PhotonNetwork.LocalPlayer.ActorNumber);
์์ ํจ์๋ Physics.Raycast๋ฅผ ์จ์, hitํ gameObject์GetPhotonView() ์ ๋ณด๋ฅผ ์ป์ด์์, RPCํจ์ DealDamage๋ฅผ ์คํํฉ๋๋ค.
if(photonView.IsMine)์ด ์์ด์, PC1์์ Aํ๋ ์ด์ด๊ฐ B๋ฅผ ๊ณต๊ฒฉํ๋ค๋ฉด, ์ ์ ๊ฐ์๋๋ ์บ๋ฆญํฐ๋ PC2์ B์ ํ์ฌ ์ฒด๋ ฅ๋ง ๊ฐ์๋ฉ๋๋ค.
์ ๋ PC1์์ ๋ PC2์์ ๋ ์ฒด๋ ฅ์ด ๊ฐ์๋๋ฉด, ๊ฐ์๋ ํ์ฌ ์ฒด๋ ฅ์ ๋ณด๊ณ ์ถ์ด์, if(photonView.IsMine) ๋ถ๋ถ์ ์ ๊ฑฐํ๋, ๋๊ตฌ๋ ํผํด๋ฅผ ์ ์ผ๋ฉด, ์ ๋ณด๋ฅผ ๋ค ๊ณต์ ํ๋ ๊ฒ ์ ๋๋ค.
์ ๊ฐ ์๊ธฐ๋ก๋ if(photonView.IsMine)์ด ์์ผ๋ฉด, PC1์์ Aํ๋ ์ด์ด๊ฐ B๋ฅผ ๊ณต๊ฒฉํ๋ค๋ฉด, PC1์ B์ PC2์ B๊ฐ ๊ฐ์ด ์ฒด๋ ฅ์ด ๊ฐ์๋๋ ๊ฒ์ ๊ณต์ ํด์ผ ํ๋๋ฐ, ์ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ ์ผ๊น์??
๋๋ง ์ง๋ฌธ์ด ์ ์ดํด๊ฐ ์๊ฐ๋; ๊ฑ ๋ด๊ฐ ์๋ ํฌํค RPC๋ IsMine ์ ๊ณ ๊ฐ๊ฒ
ํฌํค์์ ๋คํธ์ํฌ ๊ฐ์ฒด๋ PhotonView ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๋์ ๊ฐ์ง๊ณ ์์ด์ผ ํจ. ์ด์ ๋ ๋คํธ์ํฌ ์์์ ํน์ ๊ฐ์ฒด๋ฅผ ์๋ณํ๊ธฐ ์ํ ์ ๋ณด(Photon View ID)๊ฐ ํ์ํจ. ๋คํธ์ํฌ ์์์ ์์ฑ๋ ๊ฐ์ฒด๋ค์ PhotonView๋ฅผ ๋๊ธฐํํ๊ณ ์๊ณ , ์ฌ๊ธฐ์๋ ๋คํธ์ํฌ ๋ก์ง์ ์ง๊ธฐ ์ํ ํ์ ์ ๋ณด๋ค์ด ๋ค์ด๊ฐ ์๋๊ฑฐ์ง. IsMine๊ฐ์ ๊ฒฝ์ฐ์๋ ๊ทธ๋ฅ LocalPlayer์ ActorNumber์ ์ด ๊ฐ์ฒด์ ์์ ์์ ActorNumber๊ฐ ๊ฐ์์ง๋ฅผ ๋ํ๋ด๋ ํ๋กํผํฐ์.
RPC ํธ์ถ์ ํ์ด์ฐ๋ฉด PhotonView ID๊ฐ X ์ธ ๊ฐ์ฒด์ ํจ์ F๋ฅผ ์ธ์ A๋ฅผ ๋ฃ๊ณ ํธ์ถํ๋ค. ์ด๊ฑฐ์. ๊ทธ๋ผ ํฌํค์ PhotonView ID๊ฐ X์ธ ๊ฐ์ฒด๋ฅผ ์ฐพ์์ ๊ทธ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ ธ๋นํค๋น์ด๋ฅผ ๋ค ๊ฐ์ ธ์์ ํจ์ ์ฐพ์. ๊ทธ๋์ PunRPC ์ดํธ๋ฆฌ๋ทฐํธ๊ฐ ํ์ํ ์ด์ ๊ฐ ๋ฆฌํ๋ ์ ํ ๋ ํจ์๋ค ๊ธ์ด์ฌ๋ ค๊ณ ํ์ํ๊ฑฐ์.
๊ทธ๋ฌ๋ฉด A๊ฐ PC 1์ ๊ฐ์ฒด์ด๊ณ B๊ฐ PC 2์ ๊ฐ์ฒด๋ผ๊ณ ํ์ ๋ PC 1์์๋ IsMine์ False ์ผ ๊ฑฐ๊ณ PC 2์์๋ IsMine์ True ์ผ ๊ฑฐ๋ผ PC 2์ B๋ง ๋ก์ง์ ์ํํ๋๊ฒ ๋ง์ง. ๊ทธ ์ดํ์ ๋ง์ ๋ญ ์ง๋ฌธํ๊ณ ์ถ์์ง ์ดํด๊ฐ ์๊ฐ
์ค๋ช ํด ์ฃผ์ ๋ต๊ธ ์ ์ ์ด๋ณด์์ต๋๋ค.
์ง๋ฌธ์ ๋ ์์ธํ ๋งํด๋ณผ๊ฒ์. ์ผ๋จ PC1 A(MINE) B // PC2 A B(MINE)์ด ์๋ค๊ณ ๊ฐ์ ํ์ ๋, PC1์ A๊ฐ hit.collider.gameObject.GetPhotonView().RPC("DealDamage",RpcTarget.All,photonView.Owner.NickName,allGuns[selectedGun].shotDamage,PhotonNetwork.LocalPlayer.ActorNumber); ๋ฅผ ์ด์ฉํด์, PC1์ B์ RPCํจ์ DealDamage๋ฅผ ํธ์ถํ๋ค๊ณ ํ์ ๋
๊ธฐ์กด์ [PunRPC] public void DealDamage(string damager, int damageAmount, int actorNumber) { if (photonView.IsMine) {} } ํํ์์๋ ๋น์ฐํ PC1์์ B์ DealDamage์ ์คํ์ด ์๋๊ณ , PC2์ B์ DealDamage๋ง ์คํ๋๊ฒ ์ฃ . photonView.IsMine์ด PC1์์๋ B๋ false๋๊น ํ์ง๋ง, if (photonView.IsMine)์ด ์๋ค๊ณ ํ ๋๋, PC1์ B์ DealDamageํจ์๋ ์คํ๋์ด์ผ ํ๋๊ฑฐ ์๋๊ฐ์?
ใ ใ PC 1์ B์์๋ ํจ์๊ฐ ํธ์ถ๋์ด์ผ ๋ง์. ๊ทผ๋ฐ ์๋๋ค๋ฉด ํฌํค๋ณด๋ค๋ ํธ์ถ๋จ๊ณ์์ ์๋ชป ํธ์ถ๋๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ํฐ๋ฏ ๋๋ฒ๊ฑฐ ์ฐ๊ฒฐํด์ ๋ธ๋ ์ดํฌ ํฌ์ธํธ ๊ฑธ์ด์ ๋ณด๋๊ฒ ์ ์ผ ์ข์๋ฏ
์ผ๋จ ๋ด ํ๊ฒฝ์์๋ ๋ฌธ์ ์์ด ํธ์ถ๋๋๊ฑฐ๊ฐ์๋ฐ ํ ์คํธ ํ๊ฒฝ ๋์ถฉ ๊ธ๋ก ๋จ๊ธฐ๊ณ ๊ฐ๊ฒ ๊ณง ๋๊ฐ์ผ ๋์
ํ ๊ทธ๋ฌ๊ฒ์ ์ผ๋จ ์ฝ๋ ๋ณด๊ณ ์๊ธดํ๋ฐ, ๋ฌธ์ ๊ฐ ์์ด์... ์ผ๋จ ์ด ๋ฌธ์ ๊ฐ์ ๊ฒฝ์ฐ๋ ๊ผผ์๋ก ํ๋ฉด, ์ ๊ฐ ์ํ๊ณ ์ ํ๋ ๋ฐ๋ ๊ตฌํ์ ํ ์ ์๊ธด ํ๋ฐ, ํ ... ๋น์ฐํ ๋์ผํ๋๊ฒ ์๋๋๊น ๊ฐ ๋ต๋ตํ๋ค์ ใ ใ ใ