반응형

빌드 테스트 중에 씬에러 발생으로 빌드를 못하다가 여러가지 뒤져서 알아낸 결과

Bulid Setting - > Player Setting 으로 들어가서

Stripping Level을 Disabled로 변경하자 빌드가 되었다~

원인은 분석중..

 

참고 사이트 - http://westwoodforever.blogspot.kr/2014/02/unityexception-failed-assemblies.html

 

 

반응형
반응형

스크립트 공부중..

회사에서 캐릭터 선택창에서 사용될 카메라 회전 구조를 정리하면서 짠 초기 코드지만, 나름 유니티 스크립트 개념을 깨워준 코딩임..ㅋㅋ

 

using UnityEngine;
using System.Collections;

public class FollowCam : MonoBehaviour
{
 
 public Transform target;     //추적할 타겟 게임 오브젝트의 Transform 변수
 public float dist = 10.0f;     // 카메라와의 일정 거리
 public float height = 5.0f;     // 카메라의 높이 설정
 public float dampRotate = 5.0f;     // 부드러운 회전을 위한 변수
 public float TurnSpeed;
 public float camPos;

 Vector3 V3;
 
 private Transform tr;
 // Use this for initialization
 void Start ()
 {
  //카메라 자신의 transform 컴포넌트를 tr에 할당
  tr = GetComponent<Transform> (); 
  TurnSpeed = 2f;
  camPos = 2f;
 }

 void Update()
 {
  Vector3 PositionInfo = tr.position - target.position;     // 주인공과 카메라 사이의 백터정보
  PositionInfo = Vector3.Normalize (PositionInfo);     // 화면 확대가 너무 급격히 일어나지 않도록 정규화~

  target.transform.Rotate (0, Input.GetAxis ("Horizontal")* TurnSpeed, 0);      //마우스 입력이 감지되면 오브젝트 회전
  transform.RotateAround (target.position, Vector3.right, Input.GetAxis ("Mouse Y")* TurnSpeed);     //마우스 Y(Pitch) 움직임 인지하여 화면 회전
  tr.position = tr.position - (PositionInfo * Input.GetAxis ("Mouse ScrollWheel")* TurnSpeed);     // 마우스 휠로 화면확대 축고
 }
}

 

마우스 회전시 카메라 좌우 회전~

오브젝트에 왼쪽마우스를 찍고 돌리면 회전~

훨로 카메라 확대 축고~ 

 

 

아래는 똑같은 형식의 모바일 터치 구현 스크립트

using UnityEngine;
using System.Collections;

public class TouchCameraControl : MonoBehaviour
{
 public Transform charTarget;
 private Camera cameratarget;
 private Vector2 PrevPoint;

 public float moveSensitivityX = 1.0f;
 public float moveSensitivityY = 1.0f;
 public bool updateZoomSensitivity = true;
 public float orthoZoomSpeed = 0.05f;
 public float minZoom = 1.0f;
 public float maxZoom = 20.0f;
 public float perspectiveZoomSpeed = .5f;
 private Transform tr;

 void Start ()
 {
  //카메라 자신의 transform 컴포넌트를 tr에 할당
  tr = GetComponent<Transform> ();
  cameratarget = Camera.main; 
 }

 void Update()
 {
  Vector3 PositionInfo = tr.position - charTarget.position;
  PositionInfo = Vector3.Normalize (PositionInfo);

  if (updateZoomSensitivity)
  {
   moveSensitivityX = cameratarget.orthographicSize / 5.0f;
   moveSensitivityY = cameratarget.orthographicSize / 5.0f;
  }

  Touch[] touches = Input.touches;

  if (cameratarget)
  {
   if (Input.touchCount == 1) {
    if (Input.GetTouch (0).phase == TouchPhase.Moved) {
     PrevPoint = Input.GetTouch (0).position - Input.GetTouch (0).deltaPosition;

     charTarget.transform.Rotate (0, -(Input.GetTouch (0).position.x - PrevPoint.x), 0);
     cameratarget.transform.RotateAround (charTarget.position, Vector3.right, -(Input.GetTouch (0).position.y - PrevPoint.y)*0.5f);

     PrevPoint = Input.GetTouch (0).position;
    }
   }
  }
  if (cameratarget) {
   if (Input.touchCount == 2)
   {
    Touch touchZero = Input.GetTouch(0);
    Touch touchOne = Input.GetTouch(1);

    Vector2 touchZeroPrevPos = touchZero.position - touchZero.deltaPosition;
    Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition;

    float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude;
    float touchDeltaMag = (touchZero.position - touchOne.position).magnitude;

    float deltaMagnitudediff = prevTouchDeltaMag - touchDeltaMag;

    tr.position = tr.position - -(PositionInfo * deltaMagnitudediff * orthoZoomSpeed);
   }
  }
 }
}

반응형
반응형

제작 방식.

1. 시뮬레이션에 적용 될 본에는 공통적으로 Rigid Body와 Collider 를 달아줘야 합니다.

Rigid Body는 시뮬레이션이 사용될 캐릭터에 반드시 들어가야할 컴포넌트이고, Collider는 시뮬레이션오브젝트가 충돌이 일어날 부분에 넣어주게 됩니다. 


 

2. 시뮬레이션이 적용된 자식 본들에는 Character Joint 컴포넌트를 셋팅해 줘야 합니다.

Connected Body에는 자신의 부모본을 넣어줍니다.

 

프로퍼티: 기능:
Connected Body 조인트가 의존하는 Rigidbody에 대한 옵션의 참조. 설정하지 않으면, 조인트는 월드에 연결합니다.
Anchor 조인트가 그 주변에서 회전하는 GameObject의 로컬 공간에서의 점.
Axis 트위스트 축. 오렌지색의 기즈모 원추로 표시됩니다.
Auto Configure Connected Anchor If this is enabled, then the Connected Anchor position will be calculated automatically to match the global position of the anchor property. This is the default behavior. If this is disabled, you can configure the position of the connected anchor manually.
Connected Anchor Manual configuration of the connected anchor position.

Swing Axis 스윙 축. 녹색 기즈모 원추로 표시됩니다.
Low Twist Limit 조인트의 하한 값을 나타냅니다. 아래를 참조하세요.
High Twist Limit 조인트의 상한 값. 아래를 참조하세요.
Swing 1 Limit 정의된 Swing Axis 주변의 하한 값. 아래를 참조하세요.
Swing 2 Limit 정의된 Swing Axis 주변의 상한 값. 아래를 참조하세요.
Break Force 조인트가 제거되도록 하기위해 필요한 힘의 크기를 나타낸다.
Break Torque 조인트가 제거되도록 하기위해 필요한 토크(torque)의 크기를 나타낸다.
Enable Collision 이 조인트가 분해하는 데 적용되어야 하는 토크.
Enable Preprocessing Disabling preprocessing helps to stabilize impossible-to-fulfil configurations.

 

상세정보

캐릭터 조인트는 유니버설 조인트의 경우와 마찬가지로, 움직임을 제한하는 많은 기능을 제공합니다.

트위스트 축(오렌지색 기즈모로 표시)에 따라 상한과 하한(한계 각도는 시작 위치로 측정됩니다)을 도(degree)로 명시함으로써, 제한의 대부분을 제어할 수 있습니다. Low Twist Limit->Limit에서의 ?30 값 및 High Twist Limit->Limit에서의 60은, ?30°와 60° 사이로, 트위스트 축(오렌지색 기즈모) 주변에서 회전을 제한합니다.

Swing 1 Limit 은 스윙 축(녹색 축) 주변에서의 회전을 제한합니다. 한계 각도는 대칭적입니다. 따라서, 예를 들면 30의 값은 ?30과 30 사이에서 회전을 제한합니다.

Swing 2 Limit 축에는 기즈모는 없지만, 이 축은 다른 두 축에 대해 직각입니다. 앞서 말한 축처럼 제한이 대칭이기 때문에, 예를 들어, 40의 값은 ?40과 40 사이에서 회전을 제한합니다.

For each of the limits the following values can be set:

프로퍼티: 기능:
Bounciness A value of 0 will not bounce. A value of 1 will bounce without any loss of energy.
Spring 스프링 힘은 두개의 오브젝트 간의 거리를 유지하기위해 사용된다.
Damper 저항력(damper force)은 스프링 힘을 약화시키기위해 사용된다.
Contact Distance Within the contact distance from the limit contacts will persist in order to avoid jitter.

 

 

3. 시뮬레이션이 적용된 본에는 애니메이션 키 값이 있으면 안된다.

stay1 모션에서 시뮬레이션 본들에게 시뮬레이션이 적용되기 위해서는 키 정보를 지워줘야 정상적으로 출력됩니다.

아마도 키 프레임이 있을경우에는 우선적으로 키 프레임이 출력되도록 강제 셋팅되어 있는거 같습니다.


 

완료영상

 

 

반응형
반응형

참고 자료

[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리

http://www.slideshare.net/agebreak/unite2015-47100325?related=1

 

유니티 그래픽 최적화, 어디까지 해봤니

http://www.slideshare.net/ozlael/graphics-opt-ndc?related=2

 

최적화 내용 간단 정리

** 가장 중요한 것은 병목 지점 파악~(메모리인지, 콜인지, CPU인지, 버텍스연산인지.. 아니면 다함께..)

** 리소스 아껴 쓰기

** 드로우콜 관리하기

** 모바일 사운드는 모노로 사용하기~

** 가비지 컬렉터 관리~~

** 스크립트 함수에 무거운 함수 쓰지 않기~

** 셰이더에 무거운 함수 사용 줄이기~

** 물리 사용은 최소로~

 

1. 프로그램 최적화

* 스크립트 최적화

--- 유니티 객체들을 변수에 저장하고, 캐싱해서 사용하는 것이 좋다.

--- FindObject 계열 함수들은 매우 느리다. (미리 찾아서 캐싱)

--- Update 함수 보다는  Coroutine을 활용한다.

--- 박싱과 언박싱은 부하가 큰 작업이다.

--- 나눗셈보다 곱셈이 몇십배 빠르다.

--- 삼각함수의 값은 상수로 저장하고, 사용하는 것이 좋다.

--- 문자열은 readonly 혹은 const 키워드를 사용하여, 가비지 컬렉션으로부터 벗어나도록 한다.

* 문제의 원인 : 가비지 컬렉터

--- Mono의 동적 메모리 관리 때문에, 메모리 해제를 위해 GC가 자동 호출 된다.

--- GC는 언제 일어날지 모른다.

--- 오브젝트(or 프리팹)의 동적생성과 해제는 부하가 크다.

--- 오브젝트 풀링 사용은 선택이 아닌 필수!

--- 문자열 병합은 StringBuilder

--- foreach 대신에 for문 사용 (foreach는 한번 돌때마다 24Byte의 쓰레기 메모리를 생성)

--- 태그 비교에는 compareTag() 사용

--- 데이터 타입에는 Class 대신 구조체 사용

--- 즉시 해체할 때는 Dispose 수동 호출

--- 임시 객체들을 만들어내는 API들을 조심하라.

* C++ <-> C# 오버헤드

--- 객체의 변경 사항을 캐싱

--- 컴포넌트 참조를 캐싱

--- 빈 콜백 함수는 제거

 

 

2. 그래픽 최적화

* 텍스쳐 최적화

--- 권장 압축 사용하기 : 아이폰 -> PVRTC   ,  안드로이드(Tegra) -> DXT , 안드로이드(Adreno) -> ATC , 안드로이드(공통) -> ETC1 / ETC2

--- 텍스쳐 사이즈는 무조건 2의 제곱이어야 한다. POT(Power of Two) 아닐 경우 무조건 POT로 강제 변환함

--- 텍스쳐는 묶어서 사용하는게 이득이다. 한 화면에 나오는 것끼리~ 같은 재질의 오브젝트끼리~ 알파가 있는것과 없는것끼리

--- 32bit 텍스쳐보다는 16bit를 큰 텍스쳐로 쓰는게 이득이다.

--- 모바일뷰에서 가장 최적화된 해상도를 찾는데 주력한다. 이거저거 다해봐도 개개의 소스를 절약하는 방식이 최고임.

* 메쉬 최적화

--- Import시에 언제나 "Optimize Mesh" 사용 - 버텍스 캐쉬를 최적화 해준다.

--- 언제나 Optimize Mesh Data 옵션을 사용한다. 사용하지 않는 버텍스 정보들을 줄여준다.

--- 사용하지 않는 버텍스 정보들을 줄여 준다.

* 드로우 콜

--- 적절한 DP 는 100이하를 추천, 보통 70~100 정도가 일반적

* CULLING

---- 각 Layer 별로 컬링 거리를 설정해 준다. 중요도가 낮은 오브젝트의 컬링커리를 짧게 설정한다.

---- 오클루젼 컬링을 활용하여 카메라 밖은 잘라내도록 한다.

* 오브젝트 통합

---- 성질이 동일한 오브젝트들은 하나의 메쉬와 재질을 사용하도록 통합

*Batch

---- 스태틱 배치와 다이내믹 배치의 적절한 조합

* 라이팅

---- 라이트맵과 라이트렌더 모드 활용

* OverDraw

--- 한 픽셀에 두 번 이상 그리게 되는 경우 OVERDRAW 문제가 발생한다.

--- 기본적으로 앞에서 뒤로 그린다. Depth testing으로 인해서 오버드로우를 방지한다. 알파 블렌딩이 있을경우 소팅 문제 발생

--- 반투명 오브젝트의 개수의 제한을 건다. 뒤에서 앞으로 그려야 함. 반투명 오브젝트 갯수가 늘어날수록 퍼포먼스 직결~!

 

 

3. 사운드 최적화

--- 모바일에서 스테레오 사용은 퍼포먼스에 큰 영향을 끼친다. -> 되도록이면 모두 92 kb, 모노로 인코딩

--- 사운드 파일을 임포트하면 디폴트로 3D 사운드로 설정 -> 2D 사운드로 변경

--- 압축 사운드(mp3. ogg) , 비압축 사운드(wav) 구별.    압축 사운드-> 순간적인 효과음, 이펙트등..      비압축사운드 -> 배경 음악 

 

 

4. 폰트 리소스 최적화

--- Packed Font - R,G,B,A channel에 각각 글자의 형태를 저장하는 방법. 메모리 용량을 1/4로 절약

--- 리소스 기타 - ResourceLoadAsync() 함수는 엄청 느리다.

 

5. 셰이더 최적화

--- 기본 셰이더를 사용할 경우, 모바일용 셰이더 사용 Movile -> VertexLit 가장 빠른 셰이더

--- pow, exp, log, cos, sin, tan 같은 수학 함수들은 고비용이다.

--- 텍스쳐 룩 업 테이블을 만들어서 사용하는 것도 좋다.

--- 알파 테스트 연산(discard)은 느리다. 무조건 최소로..

--- 라이트맵 활용은 필수.

* 실수 연산

--- float : 32bit -> 버텍스 변환에 사용, 아주 느린 성능 (픽셀 셰이더에서 사용은 피함)

--- Half : 16bit -> 텍스쳐 uv에 적합, 대략 2배 빠름

--- fixed : 10bit -> 컬러, 라이트 계산과 같은 고성능 연산에 적합, 대략 4배 빠름]

 

6. 물리 엔진 최적화

--- FixedUpdate()는 Updata와 별도로 주기적으로 불리며, 주로 물리 엔진 처리

--- Default는 0.02초, 게임에 따라 0.2초 정도로 수정해도 문제 없음

--- 물리 엔진이 적용되지 않는 오브젝트는 Static으로 설정

--- 리지드 바디가 없는 고정 충돌체를 움직이면, CPU 부하 발생 - 물리 월드 재구성 - 이럴경우 isKinematic 옵션 사용

--- Maximum Allowed timestep 조정하여 물리 계산을 건너뛸 수 있는 부분은 무조건 건너 뛴다.

--- EDIT -> Project Setting -> Physics 에서 Solver Iteration Count 조정. 높을수록 정교하므로 낮게 설정한다.

--- Sleep 조절 -> 리지드 바디의 속력이 설정된 값보다 작을 경우, 휴면상태에 들어감.

--- Physics.Sleep() 함수를 이용하면, 강제 휴면 상태로 만듬.

--- 래그돌 사용 최소화

--- 태그 대신 레이어 활용 - 물리처리에서 레이어가 훨씬 유리, 성능과 메모리에서 장점을 가진다.

--- 메쉬 콜리더는 절대 사용 금지.

--- 레이캐스와 Sphere Check 같은 충돌 감지 요소를 최소화

--- Tilemap Collision Mesh -- 2D 게임에서 타일맵의 Collison Mesh를 최적화 하라.

 

반응형
반응형

루트 모션 사용하기

1. 루트 본 설정하기

- 기존과 동일하게 임포트 한 후 애니메이션을 등록할때 RootNode를 설정해 주면 됩니다.

 

2. 루트 모션의 특성을 지정한다.

Tramsform 이나 특정 축에 따라 어떤 방식으로 할지 정할 수 있습니다.

Original로 할 경우 원래 방향성을 유지하게 되고 Root Node Position으로 할 경우 지정된 루트 노드의 방향성과

위치값을 그대로 따라가게 됩니다. (Bone001을 루트 노드로 설정하면 무조건 Bone001을 따라가게 됨)

평면축에서만 루트 모션을 사용하고 싶을때는 마지막에 있는 Root Transforrm Position(XZ) 만 루트 노드를 따라가게 하면 됩니다.

  

3. 설정이 완료되면 루트모션이 적용됩니다.

캐릭터 발 아래의 둥근 원이 루트 모션이 사용될 Root Node 입니다.(루트 모션 적용이 안되면 아래 원이 따라다니지 않습니다.)

 

반응형
반응형
반응형

+ Recent posts