Unity3D에서 사격 게임을 개발하는 사고방식 (1)

3993 단어
최근 많은 친구들이 전지, 사명 소환처럼 리얼한 사격 체험을 어떻게 실현할 것인가를 물었다.먼저 우리는 애니메이션 작가의 도움 없이 인위적인 시뮬레이션의 뒷좌력, 정확도 편이 등을 실현하려면 사실 그리 어려운 일이 아니라는 것을 알아야 한다. 오늘 우리는 비교적 짧은 코드로 시뮬레이션의 총기 뒷좌력을 실현하고자 한다.
먼저 필요한 도구 클래스 코드가 있습니다.
public class Spring3
{
	public Vector3 value = Vector2.zero;
	private Vector3 dampValue = Vector2.zero;
	private float damp = 1;
	private float frequence = 1;
 	public void Clear ()
	{
		value = Vector2.zero;
		dampValue = Vector2.zero;
	}
	public Spring3 (float damp, float frequence)
	{
		this.damp = damp;
		this.frequence = frequence;
	}
	public void Update (float deltaTime, Vector3 target)
	{
		value -= dampValue * deltaTime * frequence;
		dampValue = Vector3.Lerp (dampValue, value - target, deltaTime * damp);
	}
}

4
	public class SpringEulerAngle
	{
		public Vector3 value = Vector2.zero;
		private Vector3 dampValue = Vector2.zero;
		private float damp;
		private float frequence = 1;


		public SpringEulerAngle (float damp, float frequence)
		{
			this.damp = damp;
			this.frequence = frequence;
		}


		public void Clear ()
		{
			value = Vector2.zero;
			dampValue = Vector2.zero;
		}


		public void Update (float deltaTime, Vector3 target)
		{
			value -= dampValue * deltaTime * frequence;
			dampValue = eulerLerp (dampValue, value - target, deltaTime * damp);
		}


		public static Vector3 eulerLerp(Vector3 left, Vector3 right, float t){
			Vector3 ret;
			ret.x = Mathf.LerpAngle (left.x, right.x, t);
			ret.y = Mathf.LerpAngle (left.y, right.y, t);
			ret.z = Mathf.LerpAngle (left.z, right.z, t);
			return ret;
		}
	}
이것은 우리가 시뮬레이션을 할 때 가장 자주 사용하는 알고리즘이다. 나는 스프링 알고리즘(정말 좋은 이름이 나오지 않는다헤헤)이라고 부른다. 알고리즘은 매우 간단하다. 우리는 자신의 value를 입력하여 삽입을 희망하는 목표로 삼고 Update 함수를 호출하면 value가 탄력적인 자세로 target과 붙게 할 수 있다. 주의해야 할 것은 damp와frequency 두 부동점수의 용도이다.덤프가 높을수록 삽입 속도가 높고 목표점에 가까워지며 frequency가 높을수록 스프링의 진동이 빨라지는 것을 볼 수 있다. 우리는 다음 시뮬레이션에서 이 두 값을 사용할 것이다.
용수철 알고리즘을 사용하면 우리는 들어올린 총구를 제자리로 돌리는 동작을 쉽게 실현할 수 있다. 그러면 우리는 어떻게 완전한 후좌력 호선을 실현할 수 있을까.우리가 총을 쏠 때(사격장에 가 본 친구는 알아야 한다) 총구는 포물선과 유사한 운동을 나타낸다. 방아쇠를 당기는 순간 총구를 빠르게 올리면 팔과 가슴의 압력에 의해 총의 상향 폭이 점점 낮아지고 떨어지기 시작하여 총을 쏘기 전의 지점으로 내려가기 때문에 우리는 코드에서 이 일련의 동작을 모의해야 한다.
이럴 때 어떤 학생이 카메라나 총의transform을 직접 물어본다.Aller Angles는 위 코드에 있는value에 묶으면 되잖아요. 이번 강좌는 끝날 수 있잖아요. 만약에 이렇게 생각하면 저는 이 학생이 지혜를 잃었다고 할 수 밖에 없어요. 영리한 학생은 이미 문제를 발견했을 거예요. 단순히 스프링을 통해 총구의 귀위를 모의할 수 밖에 없어요. 그런데 총구를 올리는 과정은 각도 편이만 강행할 수 있고 우리가 말한 포물선 효과를 실현할 수 없어요.그래서 우리는 반드시 다른 삽입값으로 한 세트의 후좌력을 시뮬레이션해야 한다.다음 스크립트를 총이나 카메라에 마운트하면 후좌력을 촉발할 수 있다.
이치를 깨달은 후에 매우 쉽게 실현되었다. 우리는 여기에 매우 간단한 코드를 썼다. 마우스 왼쪽 단추를 눌러서 터치하면 목표에 무작위 각도를 가하고 포물선 성질의 편이를 실현한다. 주의해야 한다. 뒷좌석 제어는 물리적 운행에 속하기 때문에 FixedUpdate에 놓고 실행해야 한다. FixedUpdate와 Update의 집행 관계는 여기서 군말하지 않는다.
4
public class Recoil : MonoBehaviour {
	SpringEulerAngle recoilTarget;
	public float damp = 20;
	public float frequence = 15;
	void Awake(){
		recoilTarget = new SpringEulerAngle (damp, frequence);
	}
	
	// Update is called once per frame
	void FixedUpdate () {
		recoilTarget.Update (Time.deltaTime, Vector3.zero);
		transform.rotation = Quaternion.Lerp (transform.rotation, Quaternion.Euler (recoilTarget.value), 0.75f);	//                       
	}

	void Update(){
		if (Input.GetMouseButtonDown (0)) {
			recoilTarget.value = new Vector3 (Random.Range (-20, 0), Random.Range (-3, 3), 0);	//               。
		}
	}
}
이 뒷좌석을 제어하는 코드를 Recoil로 저장합니다.cs는 카메라나 모형에 마운트하고 왼쪽 단추를 누르면 효과를 볼 수 있다. 단지 자신의 이상적인 뒷좌석력을 실현하려면 끊임없이 참여를 통해 자신을 만족시키고 계획을 만족시키는 효과를 얻어야 한다.

좋은 웹페이지 즐겨찾기