VRChat SDK U# 코딩 (2)

최 소 금·2024년 1월 9일

VRChat World 제작

목록 보기
2/4

디펜스 게임 제작 계기

기초부터 다시 배우자는 생각으로 옛날에 만들었던 월드를 제작해보려고 하였지만
너무 기초적이고 프로그래밍을 사용하는 부분보다 SDK 내에서 제공해주는 Component의 PickUp하고 Object Sync만 사용해도 제작할 수 있기에 새로 디펜스 게임을 제작하게 되었다.

총 발사 시스템 제작

User가 PickUp을 하자마자 총의 총알이 발사되게 하는 시스템을 제작하고 싶었다.

코드

using System.Collections;
using UdonSharp;
using UnityEngine;
using UnityEngine.InputSystem.Utilities;
using VRC.SDKBase;
using VRC.Udon;
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]

public class GunBullet : UdonSharpBehaviour

{
	public float gunShootingSpeed = 1.0f;//공격속도
	public GameObject bulletObj;//탄환
	public float force = 10;

	private bool isShooting = false; // 발사 여부

	public void oneShoot()
	{
		if (!isShooting) return;

		Rigidbody rb;

		GameObject Temp = VRCInstantiate(bulletObj);

		Temp.transform.SetPositionAndRotation(this.transform.position, this.transform.rotation);//탄환 생성되는 곳이 GunBody

		rb = Temp.GetComponent<Rigidbody>();

		if (rb == null)
		{
			Debug.LogError("Rigidbody component not found on the object.");
		}

		Vector3 forceDirection = transform.forward;
		rb.AddForce(forceDirection * force, ForceMode.Impulse);

		SendCustomEventDelayedSeconds("oneShoot", gunShootingSpeed);
	}

		public override void OnPickup()
	{
		isShooting = true; //
		oneShoot(); //최초 발사
	}

	//숙제. 드랍시 총알이 안날라가게.
	public override void OnDrop()
	{
		isShooting = false; // 발사 중지
	}

	//나중. OnPickupUseDown을 사용해서 총알 ON/OFF 시스템 작성

코드 원문이다.

이제 Rage님께서 가르쳐주신대로 작성한 코드 해석.

선언

	public float gunShootingSpeed = 1.0f;//공격속도
	public GameObject bulletObj;//탄환
	public float force = 10; //탄속
    

처음에 공격속도, 탄환을 선언해줬다.

총알이 발사되게 하는 코드

public void oneShoot()
{
	Rigidbody rb;

	GameObject Temp = VRCInstantiate(bulletObj);

	Temp.transform.SetPositionAndRotation(this.transform.position, this.transform.rotation);//탄환 생성되는 곳이 GunBody

	rb = Temp.GetComponent<Rigidbody>();

	if (rb == null)
	{
		Debug.LogError("Rigidbody component not found on the object.");
	}

	Vector3 forceDirection = transform.forward;
	rb.AddForce(forceDirection * force, ForceMode.Impulse);

	SendCustomEventDelayedSeconds("oneShoot", gunShootingSpeed);

	
}
if (!isShooting) return;

return; 을 넣어주어 나중에 작성한 onDrop을 위해 초기화를 시켜주었다.

Rigidbody rb;

GameObject Temp = VRCInstantiate(bulletObj);

Temp.transform.SetPositionAndRotation(this.transform.position, this.transform.rotation);

rb = Temp.GetComponent<Rigidbody>();

Rigidbody rb; : Rigidbody Component를 사용하기 위해 작성
GameObject Temp = VRCInstantiate(bulletObj);을 하여 Clone을 만들고 Temp(임시변수)에다가 저장
Temp.transform.SetPositionAndRotation(this.transform.position, this.transform.rotation); 총알이 발사되는 위치를 this를 이용하여

총알이 발사되는 위치를 GunBody로 설정하였다.

rb = Temp.GetComponent<Rigidbody>(); : rbTemp라는 Rigidbody Component를 할당.

Vector3 forceDirection = transform.forward;
rb.AddForce(forceDirection * force, ForceMode.Impulse);

SendCustomEventDelayedSeconds("oneShoot", gunShootingSpeed);

transform.forward를 하여 forceDirection에다가 탄이 어디로 가야하는지 방향이 어딘지 알려주고
rb.AddForce(forceDirection * force, ForceMode.Impulse);

rb.AddForce : rb(Rigidbody)에다가 AddForce가 힘을 전달해줌.
ForceMode.Impulse : 정지 상태일 때 누가 앞으로 미는 힘으로 생각해도 될 것 같다.

public override void OnPickup()
{
	oneShoot(); //최초 발사
}

그리고 최초발사가 될 수 있도록 oneShoot();까지 작성

해당코드는 처음에 oneShoot();이 아니라 SendCustomEventDelayedSeconds를 사용하여 작성하였다.
하지만 SendEvent로 하였을 때 OnPickup하자마자 총알이 날라가지 않는다.
처음에 SendCustomEventDelayedSeconds으로 실행되기에 유저가 OnPickup를 하자마자 총알이 나가지않고 n초 후에 실행되기 때문이다.

숙제. 드랍시 총알이 안날라가게 만들 것.

private bool isShooting = false; // 발사 여부

public void oneShoot()
{
	if (!isShooting) return;//초기화
    
    //코드생략
}

public override void OnPickup()
{
	isShooting = true;
	oneShoot(); //최초 발사
}

public override void OnDrop()
{
	isShooting = false; // 발사 중지
}

bool 함수를 사용하여 ON/OFF 형식으로 만들면 되는데...
계속 이상하게 만들어 시간이 오래 거렸다.

profile
부족함이 많지만 항상 배우고 있는 학부생입니다 :>

0개의 댓글