Sound & Object Collection

2011. 6. 30. 18:02게임 개발/OpenGL

Unity3D Korea 에 있는 강좌를 보면서 공부를 하는 중입니다.
저작권 문제가 있지는 않을것 같지만.. 혹여나.. 문제가 된다면.. 말씀해주세용


해당글 : http://www.unity3dkorea.com/bbs/board.php?bo_table=m04_2&wr_id=13&page=7

http://www.willgoldstone.com/downloads/unity

해당 폴더에 강좌에 필요한 소스 파일이 있답니다. ^^


1. Sound & Object Collection 1

 

Sound를 적용하는 방법을 하는데
Audio > Audio Source
를 적용한다.
Loop
도 적용하구..

Volcano 쪽도 적용하는데, 적용하려는 원본 파일이...
3D
사운드..볼륨이 제한이 되어 있더군요..
Unity
가 업그레이드 되면서.. 적용방법이 변경이 된것 같습니다.

2. Sound & Object Collection 2

우선 보석 먹기를 할것 같습니다.
하단에 글씨를 넣구요... GUI TEXT
그다음 아래와 같은 스크립트를 추가 해 줍시다.

function Update () {
 
 var prefix = "Gems: ";
 var suffix = "/3";
 guiText.text = prefix + GemCollect.Count + suffix;
 
}


Gem
를 만들었답니다..(Cinema 4D에서 제작해서.. 이동)


3. Sound & Object Collection 3

그다음에는 Material 를 추가하지요... 색상도 넣고..
shader
FX > Glass > Stained BumpDistorted Specular 로 설정..
그리고 Tag 도 지정해 줍시다.
(Shader 부분은 공부 해야 할 양이 상당합니다. 우선 현재 기본으로 제공하는 Shader에 대해 충실하는 방향으로 진행 함)

4. Sound & Object Collection 4

.. 이번에는 Particle System 를 추가 합니다.
Gem
에 다가 추가하고... Gem 이 돌아가게 스크립트도 추가 하고.. 음... 이게 과연 올바른 걸까?
Update 문에다 계속 보석이 빙글빙글 돌아가게 하는데..

var speed : float = 50.0;

function Update () {
 
 var spinAmount = Time.deltaTime * speed;
 transform.Rotate(0, spinAmount, 0);
 
}

 .. 이번에는 Particle System 에 대한 속성 부분을 간략히 보면,

Min Size :
폴리곤 최저 크기
Max Size :
폴리곤 최고 크기
(
최저~최고로 랜덤으로 나온다.)

Min Energy : 내품었을때부터 사라지는데 걸리는 시간 (최저)
Max Energy :
내품었을때부터 사라지는데 걸리는 시간 (최고)

Min Emission : 초당 내뿜는 폴리곤 수 (최저)
Max Emission :
초당 내뿜는 폴리곤 수 (최고)

 

5. Sound & Object Collection 4

Gem Collection 하는 방법에 대해서 ... 간단히 tag 걸어 놓고 그 태그가 충돌하면, 삭제 시키면서 카운트 올리고, 소리 켜주고...

static var Count : int = 0;
var CollectSound : AudioClip;

function OnControllerColliderHit(hit:ControllerColliderHit){

 if(hit.gameObject.tag == "gem"){
  
  Destroy(hit.gameObject);
  Count++;
  audio.PlayOneShot(CollectSound);
 } 
 
}

 

걷는 스크립트 ... 여기서 FixedUpdate 가 나오는데, 이건 해당 프레임마다 Update 가 되는 것이라고 보면 되는데,
자세한 내용은 다음에 설명 하겠다.

Update - 매 프레임마다 한번씩 호출되는 함수. 프레임단위로 호출되기 때문에 이전 프레임과의
시간차가 일정하지 않으므로 TIme.deltaTime을 사용하여 이전 프레임과의 시간차를 확인하여 사용해야한다.

FixedUpdate - 매 프레임별로 호출되지만 시간차가 부정확한 Update와는 달리
일정한 시간 간격차를 두고 한번씩 호출되는 함수. Framerate가 낮으면 한 프레임에 여러번 불려질 수 있으며
Framerate
가 높으면 한 프레임에 호출이 없을수도 있다.
이러한 Framerate와 독립적인 타이머에 의한 호출때문에 Time.deltaTime이 많이 필요한 모든 물리적 연산과 업데이트는 FixedUpdate()가 호출이 완료된 다음 이루어진다
.
(Framerate
와 독립적이기 때문에 FixedUpdate()메소드 안에선 Time.deltaTime을 사용할 필요가 없다.)

LateUpdate - Update와 마찬가지로 매 프레임마다 한번씩 호출되는 함수이지만, Update가 호출이 완료된 이후에 호출되는 특징을 갖고있다.
주로 Update()에서 캐릭터를 움직인다음, LateUpdate()에서 카메라를 이동시킨다거나 하는 용도로 사용한다
.
(LateUpdate()
에서 카메라를 이동시키는 이유는 Update()에서 캐릭터가 이동했다고 확실하게 신뢰할수 있기 때문.)

 

var speed = 6.0;
var jumpSpeed = 8.0;
var gravity = 20.0;

private var moveDirection = Vector3.zero;
private var grounded : boolean = false;

function FixedUpdate() {
 if (grounded) {
  // We are grounded, so recalculate movedirection directly from axes
  moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
  moveDirection = transform.TransformDirection(moveDirection);
  moveDirection *= speed;
  
  if (Input.GetButton ("Jump")) {
   moveDirection.y = jumpSpeed * 10;
  }
 }

 // Apply gravity
 moveDirection.y -= gravity * Time.deltaTime;
 
 // Move the controller
 var controller : CharacterController = GetComponent(CharacterController);
 var flags = controller.Move(moveDirection * Time.deltaTime);
 grounded = (flags & CollisionFlags.CollidedBelow) != 0;
}

@script RequireComponent(CharacterController)




마우스를 통해 보는 스크립트


using UnityEngine;
using System.Collections;

/// MouseLook rotates the transform based on the mouse delta.
/// Minimum and Maximum values can be used to constrain the possible rotation

/// To make an FPS style character:
/// - Create a capsule.
/// - Add a rigid body to the capsule
/// - Add the MouseLook script to the capsule.
///   -> Set the mouse look to use LookX. (You want to only turn character but not tilt it)
/// - Add FPSWalker script to the capsule

/// - Create a camera. Make the camera a child of the capsule. Reset it's transform.
/// - Add a MouseLook script to the camera.
///   -> Set the mouse look to use LookY. (You want the camera to tilt up and down like a head. The character already turns.)
[AddComponentMenu("Camera-Control/Mouse Look")]
public class MouseLook : MonoBehaviour {

 public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY = 2 }
 public RotationAxes axes = RotationAxes.MouseXAndY;
 public float sensitivityX = 15F;
 public float sensitivityY = 15F;

 public float minimumX = -360F;
 public float maximumX = 360F;

 public float minimumY = -60F;
 public float maximumY = 60F;

 float rotationX = 0F;
 float rotationY = 0F;
 
 Quaternion originalRotation;

 void Update ()
 {
  if (axes == RotationAxes.MouseXAndY)
  {
   // Read the mouse input axis
   rotationX += Input.GetAxis("Mouse X") * sensitivityX;
   rotationY += Input.GetAxis("Mouse Y") * sensitivityY;

   rotationX = ClampAngle (rotationX, minimumX, maximumX);
   rotationY = ClampAngle (rotationY, minimumY, maximumY);
   
   Quaternion xQuaternion = Quaternion.AngleAxis (rotationX, Vector3.up);
   Quaternion yQuaternion = Quaternion.AngleAxis (rotationY, Vector3.left);
   
   transform.localRotation = originalRotation * xQuaternion * yQuaternion;
  }
  else if (axes == RotationAxes.MouseX)
  {
   rotationX += Input.GetAxis("Mouse X") * sensitivityX;
   rotationX = ClampAngle (rotationX, minimumX, maximumX);

   Quaternion xQuaternion = Quaternion.AngleAxis (rotationX, Vector3.up);
   transform.localRotation = originalRotation * xQuaternion;
  }
  else
  {
   rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
   rotationY = ClampAngle (rotationY, minimumY, maximumY);

   Quaternion yQuaternion = Quaternion.AngleAxis (rotationY, Vector3.left);
   transform.localRotation = originalRotation * yQuaternion;
  }
 }
 
 void Start ()
 {
  // Make the rigid body not change rotation
  if (rigidbody)
   rigidbody.freezeRotation = true;
  originalRotation = transform.localRotation;
 }
 
 public static float ClampAngle (float angle, float min, float max)
 {
  if (angle < -360F)
   angle += 360F;
  if (angle > 360F)
   angle -= 360F;
  return Mathf.Clamp (angle, min, max);
 }
}



음.. 조금씩 감이 잡혀 오는 듯한 느낌이요.. ^^