본문 바로가기
게임 개발(유니티)/멋쟁이 사자처럼 3기_회고록

멋쟁이 사자처럼 과제1_앵그리버드류 게임 제작(3)

by goraku97 2024. 12. 28.

스크립트 특징

4. slingshot

slingshot.cs
0.01MB

 

마우스 입력상태 표시

- 마우스의 입력상태를 표현할 때, 해당 맴버변수(isMouseDown)을 

  사용하면 마우스 입력 상태를 명확히 관리 할 수 있음.(에러가 덜생김)

// 마우스가 눌려 있는지 확인
// 마우스의 입력상태를 표현할때,해당 맴버변수(isMouseDown)를 사용하면
// 마우스 입력 상태를 명확히 관리할 수 있음.(에러가 덜생김)
private bool isMouseDown;

 

라인 랜더러 표시

- 직선인 라인 랜더러를 표현하고 싶으면 배열뒤에 " .positionCount = 2 " 를 붙여야 함
   (직선이 되려면 점의 개수가 2개가 되어야 하기 때문에)

// LineRenderers 배열의  lineRenderer 객체의 점 개수를 2로 설정
// 직선이 되려면 점의 개수가 2개가 되어야함. 따라서 각 배열에 positionCount = 2 을 작성.
lineRenderers[0].positionCount = 2;
lineRenderers[1].positionCount = 2;

 

컴포넌트 비활성화

오브젝트의 컴포넌트를 활성화 시키고 싶으면 변수뒤에 " .enabled = true"

비활성화 시키고 싶으면 ".enabled = false" 를 사용
(현재 스크립트에서는 콜라이더 컴포넌트를 비활성화 시키기 위해 사용됬음)

// 몬스터가 생성될때, 충돌효과 비활성화
MonsterCollider.enabled = false;

 

마우스 좌표변환

마우스의 현재 화면 좌표를 3D 공간에서의 위치로 변환하고 싶으면 
Vector3 변수이름 = Input.mousePosition; 사용.
(추가적으로 마우스 좌표를 3D 월드 좌표로 변환하려면 z 값이 필요함)

// Input.mousePosition은 화면 상의 마우스 위치를 픽셀 단위로 반환. 이 값은 (x, y) 좌표로 주어지며, z 값은 화면 깊이를 나타냄
// **마우스의 현재 화면 좌표를 3D 공간에서의 위치로 변환하고 싶으면 
Vector3 mousePosition = Input.mousePosition;
// 마우스 좌표를 3D 월드 좌표로 변환하려면 z 값이 필요함.
// 카메라와의 거리를 설정하여 2D -> 3D 공간으로 변환할 때, 정확한 위치를 얻도록 함.
// 현 씬에서는 z값을 10f 로 설정하면, 고무줄을 이리저리 당겨봐도 생성된 프리팹이 뒤집히지 않고 일정한 모양을 유지함.
mousePosition.z = 10f;

 

2D -> 3D 좌표계 변환

2D 에서 3D 좌표계로 변환하고 싶으면 
변수이름 = Camera.main.ScreenToWorldPoint(매개 변수); 사용.

// 2D -> 3D좌표계로 변환.
// 화면 상의 mousePosition를 월드 공간에서의 위치로 변환하여 currentPosition에 저장  
// ***해당 코드를 사용함으로서, 슬링샷의 고무줄의 끝점(고무줄의 자유롭게 움직이는 끝 부분) 위치를 제어할 수 있게 됨.
currentPosition = Camera.main.ScreenToWorldPoint(mousePosition);

 

백터의 크기 제한

벡터의 크기(길이)를 제한하면서 벡터의 방향은 그대로 유지하고 싶을땐
Vector3.ClampMagnitude(Vector3, maxLength) 사용

// Vector3.ClampMagnitude 는,벡터의 크기(길이)를 제한하면서 벡터의 방향은 그대로 유지하도록 하는 함수
// currentPosition - slingshotcenter.position은 슬링샷의 중심에서 마우스까지의 벡터를 계산
// Vector3.ClampMagnitude로 그 거리를 제한
// 거리가 제한된 벡터가 슬링샷의 중심 위치(slingshotcenter.position)에서 시작
currentPosition = slingshotcenter.position + Vector3.ClampMagnitude(currentPosition -
    slingshotcenter.position, maxLength);

 

백터의 움직임 제한

3D 공간상에서 어떤 위치나 움직임을 제어할 때,  또는 특정 영역 안에서만 움직이도록 하고 싶을 때 
Vector3 ClampBoundary(Vector3 vector) 함수를 사용
(끝에 return vector; 를 작성하지 않으면, ClampBoundary 함수가 정상적으로 작동되지 않음)

// 고무줄을 특정 범위에서만 당길 수 있게 설정
    // Vector3 는 3D공간에서의 월드좌표
    Vector3 ClampBoundary(Vector3 vector)
    {
        // vector.y 값을 bottomBoundary와 1000 사이로 제한
        vector.y = Mathf.Clamp(vector.y, bottomBoundary, 1000);
        
        // vector를 반환
        // ** 해당 코드를 작성해야 ClampBoundary 함수가 정상적으로 실행됨
        return vector;
    }
}

 

 

즉각적인 백터의 속도 구현

".Velocity" 를 사용하면 즉각적인 움직을 구현할 수 있음.
(Add Force()는 물체의 질량에 따라 가속도가 붙어서 속도가 달라지지만, .velocity는 물체의 속도가 변하지 않음)

// 계산된 힘을 Monster 객체에 적용하여 "속도" 를 설정.
// .Velocity 를 사용하면 즉각적인 움직을 구현할 수 있음.
// (Add Force()는 물체의 질량에 따라 가속도가 붙어서 속도가 달라지지만, .velocity는 물체의 속도가 변하지 않음
Monster.velocity = MonsterForce;

 

null로 몬스터 정보 초기화

다음에 새로운 몬스터를 발사할 때(사용할 때), 이전에 사용한 몬스터랑

충돌하지 않게 하기 위해 정보를 null 로 초기화함
초기화를 하면 다음에 생성될 몬스터의 상태를 안전하게 보장시킴(오류발생을 줄임)

// 이미 날아간 몬스터의 정보를 null 로 초기화함으로서 
// 음에 생성될 몬스터의 상태를 안전하게 보장시킴(오류발생을 줄임)
Monster = null;
MonsterCollider = null;