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초뒤 총알제거
}
} |
|