title: “Vrchat Udon 월드 총” categories:

  • UDONSHARPexample

    #Vrchat Udon 월드 총 : 네이버 블로그

디스코드 rage147#2898

우동 관심있는분 친추 주세요!!

아니면 서버 들어오세용~~

https://discord.gg/E8rF9uTggA


오늘 소개할 것은

맞으면 텔레포트 하는 총입니다

https://booth.pm/ja/items/2683757

총의 모델은 위 부스에서 가져왔습니다!!

첨부파일

TeleportGun.unitypackage

파일 다운로드

프리펩 안에는 gun이 메인으로 있고

BulletParticle

AimCam

gun model

Gunsound

네가지 하위 오브젝트가 있습니다

gun은 플레이어가 들 수 있고 마우스 클릭이나 VR트리거를 당기면 파티클을 활성화시키는 기능을 합니다

AimCam은 총을 들면 에임 카메라가 켜지고 화면을 보여주는 기능을 합니다

gun model은 총의 3d 모델입니다

Gunsound는 발사음 소리 소스입니다

먼저 세부적인 기능 맞으면 텔레포트를 하게 돼는 BulletParticle 부터 보겠습니다

일단 파티클의 Collision을 키고

Collides with에서 Player와 PlayerLocal을 선택합니다

이것은 맞으면 반응하는 파티클과 같은 원리입니다.

https://gall.dcinside.com/mgallery/board/view/?id=vr&no=85714

[[강좌]플레이어에게 맞으면 반응하는 파티클 만들기 - VRChat 갤러리 응용은 알아서 하면 됨.너네들이 그렇게 궁금해하던 데스건의 원리이기도 하다.하지만 이 기술이 풀린다고 해서 데스건 만들 놈들은 원래부터 그럴놈들(핵을쓰든 뭘쓰든 데스건쏠 떡잎놈들)이라 생각되고, 너희들이 좀 더 멋진

gall.dcinside.com](https://gall.dcinside.com/mgallery/board/view/?id=vr&no=85714)

위의 링크에서는 파티클이 플레이어와 반응하면 새로운 파티클을 생성하지만

제가 필요했던것은 플레이어가 부딫히면 특정 이벤트를 실행하는 것이였습니다

그러므로 사진 아래처럼

Send Collision Messages를 킵니다

이로 인해 플레이어가 부딪히면 특정 이벤트가 실행됩니다

파티클 시스템 내에 있는 소스 코드입니다

using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;
using UnityEngine.UI;

public class particle : UdonSharpBehaviour
{
 public Vector3 O\_Vector3;//맞으면 텔레포트 될 위치
 
 Quaternion Quater; //회전각입니다. 기본으로 설정합니다

 void Start()
 {
 }
 public override void OnPlayerParticleCollision(VRCPlayerApi player) //파티클에 아까 설정한 플레이어가 맞으면 실행되는 이벤트입니다
 {
 //위에서 선언된 VRCPlayerApi player는 부딪힌 플레이어를 의미합니다.
 player.TeleportTo(O\_Vector3, Quater);//텔레포트를 보내줍시다
 }

}

엄청 간단한 코드입니다.

저는 많이 헤맸었는데

OnCollisionEnter와 OnTriggerEnter를 처음에 써보다가 작동을 안하기에 삽질을 하다가 찾게 되었습니다

어쨋거나 간단한 코드지요?

다음은 총인 gun입니다

먼저 컴포넌트부터 보겠습니다

VRC Pickup을 추가해 손으로 집을 수 있게 했습니다

아래는 Udon 스크립트

그 아래는 오브젝트의 싱크를 (글로벌오브젝트)설정해

다른 플레이어가 물건을 이동시켜도 같이 움직이게끔 합니다

Pickup인지 Syne문제인지 모르겠지만

Udon 스크립트에서 Manual로 하려니깐 오류가 나더라고요.

메뉴얼로도 pickup을 설정할수 있을거같긴 한데 귀찮으니 그냥 Continuous를 사용했습니다

gun안의 코드입니다.

하나씩 보겠습니다

gun 코드의 기능을 크게 나누자면

잡으면 에임 화면 키기

플레이어가 클릭이나 VR트리거를 누르면 총을 쏘기

총알이 날라가는 동안 총을 못쏘게 하기

컴퓨터인 경우 총을 집을 때 자동으로 총을 쏘는 경우가 생김. 이를 방지

이렇게 나눌 수 있습니다

아래는 변수들입니다

public float ReloadTime = 0.2f; //한발을 쏜 후 기다리는 시간입니다. 너무 짧으면 연타할때 기관총처럼 나갑니다

 bool GunShotCheck;//update에서 총을 쏘는지를 검사합니다
 bool GunShotCheckOnce;//총을 쏠때 한번 해야하느 과정을 했는지 검사힙니다
 bool CheckEnd;//총을 쏘는 과정이 끝났는지 검사합니다
 public GameObject Gun;//Gun은 파티클 게임 오브젝트입니다
 float time;//시간을 저장할 변수입니다
 public AudioSource gunsound; //총을 쏠때 나오는 사운드입니다
 int Computer = 0;//컴퓨터일때 사용하는 과정입니다
 public GameObject Aim; //에임 카메라입니다

먼저 잡으면 에임 화면 키기부터 보겠습니다

public override void OnPickup() //손으로 들면
 {
 Aim.SetActive(true); //Aim게임 오브젝트를 활성화합니다
 }

Aim은 카메라가 있고 카메라의 화면이 있습니다. 손으로 잡음으로 에임을 활성화합니다

잡으면 에임 화면 키기

플레이어가 클릭이나 VR트리거를 누르면 총을 쏘기

총알이 날라가는 동안 총을 못쏘게 하기

컴퓨터인 경우 총을 집을 때 자동으로 총을 쏘는 경우가 생김. 이를 방지

하나 끝

public override void OnPickupUseDown()//이 이벤트는 물건을 든 후 마우스를 누르면 실행됩니다
 { //이 물건을 집은 후 작동을 하면 이 이벤트가 실행됩니다
 //컴퓨터인 경우 물건을 집으면 바로 쏴지는 현상이 있습니다. 이를 방지하기 위해 컴퓨터는 두번 이상 작동해야 총을 쏠 수 있게 합니다
 if (Networking.LocalPlayer.IsUserInVR() == false) //vr이 아니면
 {
 if (Computer > 1)//Computer는 아래 else에서 1 증가합니다. 즉 2번이상 작동해야 진짜 총을 쏠 수 있습니다. 그 전은 총을 잡을 때 총알이 발사되는 현상을 방지합니다
 {
 if (CheckEnd)
 {
 CheckEnd = false;//총을 쏘는 중임을 의미합니다.
 SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, "GunShot");
 //모든 플레이어에게 GunShot라는 기능을 실행시킵니다
 
 }
 }
 else //작동이 2번 이하면 Computer를 1 올려 위 코드를 실행하게 합니다
 Computer++;
 }
 else //vr이면
 {
 if (CheckEnd)//
 {
 CheckEnd = false;//총을 쏘는 중임을 의미합니다.
 SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, "GunShot");
 //모든 플레이어에게 GunShot라는 기능을 실행시킵니다
 }
 }

플레이어가 클릭이나 VR트리거를 누르면 총을 쏘기

총알이 날라가는 동안 총을 못쏘게 하기

컴퓨터인 경우 총을 집을 때 자동으로 총을 쏘는 경우가 생김. 이를 방지

//위에서 실행된 GunShot입니다
 public void GunShot()
 {
 Gun.SetActive(true); //파티클을 활성화시킵니다
 GunShotCheck = true; //총을 쏘는 것을 검사하는 GunShotCheck를 참으로 둡니다
 GunShotCheckOnce = true; //총을 쏠 때 한번 하는 과정을 참으로 둡니다
 
 }

플레이어가 클릭이나 VR트리거를 누르면 총을 쏘기

총알이 날라가는 동안 총을 못쏘게 하기

//update에서 시간을 측정합니다

 private void Update()
 {
 
 if (GunShotCheck) //총을 쏘는지 검사
 {
 if (GunShotCheckOnce) 
 {
 gunsound.Play(); //총 소리 내기
 time = Time.time; //시간 기준을 잡기
 GunShotCheckOnce = false; //한번만 실행

 }

 if (time + ReloadTime < Time.time) { 
 Gun.SetActive(false); //파티클을 끄기
 GunShotCheck = false; //더이상 update에서 총을 발사하지 않음
 CheckEnd = true ; //총 발사가 끝났음을 알림
 }
 }
 }

총알이 날라가는 동안 총을 못쏘게 하기

이렇게 코드에 대한 설명이 끝났습니다

하나 더 설명하면 카메라입니다

조준 화면을 만드는 방법

카메라를 추가 한 후 Assets에 빈 메테리얼을 만듭니다

타겟 텍스쳐에 넣으면 이 텍스쳐가 화면이 됩니다.

ps. 처음에는

물건일 집고 입력을 받을 때

public override void InputUse(bool value, UdonInputEventArgs args)

InputUse를 썼었습니다

그런데 이는 물건을 집고 입력을 받는 것이 아닌 모든 플레이어에게 입력을 받는 것이였습니다

즉 물건을 잡지 않아도 총을 쏠 수 있었습니다;;

이후 OnPickupUseDown()을 사용하니 해결되었습니다.

업데이트: