Unity 5로 FPS 형태의 1인칭 시점으로 돌아다니고 점프하고 총알 발사하기를 이런저런 형태로 테스트 해보다.

15/10/17 토

* Player에는 Component-Physics-Character Controller를 적용해 두었다. (점프를 만들기 위해)
* Player 하위에 플레이어 시야용 Camera 추가.
* Player 앞쪽에 총알 생성될 위치에 빈 게임오브젝트 생성.

* 주인공은 화살표 상, 하, W, S 키로 전/후진, 화살표 좌, 우, A, D 키로 좌우 회전을 한다. space 키를 누르면 점프를 하고 마우스 좌클릭/좌 ctrl키 클릭시 전방으로 총알을 발사한다.

//주인공 키보드로 조종하기, 점프하기, 총알 발사하기.

var movSpeed = 5; //이동속도(m/s)
var rotSpeed = 120; //회전속도(각도/s)
var power = 12000; //총알 발사속도
var pBullet:GameObject; //총알 프리팹
//private var playerCam:GameObject; //플레이어 시야 카메라
private var bSpawn:GameObject; //총알 생성위치

function Start () {
	bSpawn = GameObject.Find("bulletSpawn"); //총알 생성위치 찾기
}

function Update () {
    updateMove(); //주인공 이동 처리
    updateJump(); //주인공 점프 처리
    updateShoot(); //주인공 총알 발사 처리
}

function updateMove(){ //주인공 이동 처리
    var dMove = movSpeed * Time.deltaTime; //프레임당 이동 거리
    var dRot = rotSpeed * Time.deltaTime; //프레임당 회전 각도
    
    var front = Input.GetAxis("Vertical"); //화살표 상하WS키로 전,후진
    var ang = Input.GetAxis("Horizontal"); //좌우AD키로 좌우 회전
    
    transform.Translate(Vector3.forward * front * dMove); //주인공 전,후진
    transform.Rotate(Vector3.up * ang * dRot); //주인공 회전
}

private var velocity:Vector3; //현재 속도
var gravity:float = 20.0; //중력 가속도
var jumpSpeed:float = 8.0; //점프 초속

function updateJump() { //주인공 점프 처리
     var controller:CharacterController=GetComponent(CharacterController);
     //바닥에 닿았을 경우
     if(controller.isGrounded){
          velocity =Vector3.zero;
          if(Input.GetButtonDown("Jump")){ //점프 버튼 클릭시
               //점프 시작, 세로방향으로 초속을 주어 점프 재생
               velocity.y = jumpSpeed;
          }
     }
     //중력에 의한 아래 방향 가속
     velocity.y -= gravity * Time.deltaTime;
     //캐릭터 컨트롤러 이동
     controller.Move(velocity * Time.deltaTime);
}

function updateShoot(){ //주인공 총알 발사 처리
	if(Input.GetButtonDown("Fire1")){ //left Ctrl key or Mouse Left Button
		var pb:GameObject = Instantiate(pBullet,
			this.bSpawn.transform.position,this.transform.rotation);
		pb.GetComponent.().AddForce(this.transform.forward * power);
		Destroy(pb, 3); //총알 3초뒤 제거
	}
}
아래의 예제는 위 예제와 거의 비슷하지만 이동 처리 방법(위의 것은 좌우 방향 전환과 전후 이동이고 아래 것은 전후좌우 이동 형태다)이 다르고 코딩 방법도 다르며 애니메이션 변환 처리까지 포함하고 있다.
var pBullet:GameObject;

var walkSpeed:float = 3.0; //걷는 속도
var gravity:float = 20.0; //중력 가속도
var jumpSpeed:float = 8.0; //점프 초속
private var velocity:Vector3; //현재 속도
private var bSpawn:GameObject; //총알 생성위치

function Start () {
	bSpawn = GameObject.Find("bulletSpawn");
}

function Update () {
	move();
	fire(); //총알발사 함수 호출
}

function move(){ //주인공 이동, 점프, 애니메이션 처리
    var controller:CharacterController=GetComponent(CharacterController);
    //바닥에 닿았을 경우 처리
    if(controller.isGrounded){
         //키 입력으로 속도 결정
         velocity = Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical"));
         velocity *= walkSpeed;
         if(Input.GetButtonDown("Jump")){ //점프 버튼 클릭시
              //점프 시작, 세로방향으로 초속을 주어 점프 재생
              velocity.y = jumpSpeed;
              GetComponent.<Animation>().Play("Jump");
         }else if(velocity.magnitude > 0.5){
              //보행 애니로 전환하며 진행방향 선회
              transform.LookAt(transform.position + velocity);
              GetComponent.<Animation>().CrossFade("Walk", 0.1);
         }else{
              GetComponent.<Animation>().CrossFade("Idle", 0.1);
         }
    }
    //중력에 의한 아래 방향 가속
    velocity.y -= gravity * Time.deltaTime;
    //캐릭터 컨트롤러 이동
    controller.Move(velocity * Time.deltaTime);
}

function fire(){ //주인공 총알 발사 처리
	if(Input.GetButtonDown("Fire1")){
		var pb:GameObject = Instantiate(pBullet,
			this.bSpawn.transform.position,this.transform.rotation);
		pb.GetComponent.().AddForce(this.transform.forward * 1000);
		Destroy(pb, 3); //3초뒤 총알제거
	}
}