기초부터 다시 배우자는 생각으로 옛날에 만들었던 월드를 제작해보려고 하였지만
너무 기초적이고 프로그래밍을 사용하는 부분보다 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>(); : rb에 Temp라는 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 형식으로 만들면 되는데...
계속 이상하게 만들어 시간이 오래 거렸다.