블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

Smooth Follow Camera

Unity3D / 2012. 11. 6. 00:10

SmoothFollow2

Author: Daniel

Improved Version

Author: Vasilis Christopoulos & Daniel Toliaferro

Contents

 [hide

Description

This is designed to make a camera smoothly follow a ship in space.

Usage

Place this script onto a camera.

JavaScript - SmoothFollow2.js

var target : Transform;
var distance = 3.0;
var height = 3.0;
var damping = 5.0;
var smoothRotation = true;
var rotationDamping = 10.0;

function Update () {
	var wantedPosition = target.TransformPoint(0, height, -distance);
	transform.position = Vector3.Lerp (transform.position, wantedPosition, Time.deltaTime * damping);

	if (smoothRotation) {
		var wantedRotation = Quaternion.LookRotation(target.position - transform.position, target.up);
		transform.rotation = Quaternion.Slerp (transform.rotation, wantedRotation, Time.deltaTime * rotationDamping);
	}

	else transform.LookAt (target, target.up);
}

C# - SmoothFollow2.cs

using UnityEngine;
using System.Collections;

public class SmoothFollow2 : MonoBehaviour {
	public Transform target;
	public float distance = 3.0f;
	public float height = 3.0f;
	public float damping = 5.0f;
	public bool smoothRotation = true;
	public float rotationDamping = 10.0f;
	
	void Update () {
		Vector3 wantedPosition = target.TransformPoint(0, height, -distance);
		transform.position = Vector3.Lerp (transform.position, wantedPosition, Time.deltaTime * damping);

		if (smoothRotation) {
			Quaternion wantedRotation = Quaternion.LookRotation(target.position - transform.position, target.up);
			transform.rotation = Quaternion.Slerp (transform.rotation, wantedRotation, Time.deltaTime * rotationDamping);
		}
		
		else transform.LookAt (target, target.up);
	}
}

C# - SmoothFollow2.cs (Improved)

using UnityEngine;
using System.Collections;

        public class SmoothFollow2 : MonoBehaviour {
        public Transform target;
        public float distance = 3.0f;
        public float height = 3.0f;
        public float damping = 5.0f;
        public bool smoothRotation = true;
        public bool followBehind = true;
        public float rotationDamping = 10.0f;

        void Update () {
               Vector3 wantedPosition;
               if(followBehind)
                       wantedPosition = target.TransformPoint(0, height, -distance);
               else
                       wantedPosition = target.TransformPoint(0, height, distance);
     
               transform.position = Vector3.Lerp (transform.position, wantedPosition, Time.deltaTime * damping);

               if (smoothRotation) {
                       Quaternion wantedRotation = Quaternion.LookRotation(target.position - transform.position, target.up);
                       transform.rotation = Quaternion.Slerp (transform.rotation, wantedRotation, Time.deltaTime * rotationDamping);
               }
               else transform.LookAt (target, target.up);
         }
}


출처 : http://wiki.unity3d.com/index.php/SmoothFollow2

반응형
Posted by blueasa
, |

... 

string shaderName = "Mobile/Unlit (Supports Lightmap)";

GameObject sampleObject;

...

 

MeshRenderer mr = sampleObject.GetComponent<MeshRenderer>();   // 일단 MeshRenderer 컴포넌트를 얻고

mr.material.shader = Shader.Find(shaderName);                                 // 쉐이더를 찾아(이름으로) 변경

 

 

 

 

<출처> http://unity3d.com/support/documentation/ScriptReference/Material-shader.html



출처 : http://blog.naver.com/kzh8055/140158747595

반응형

'Unity3D > Shader' 카테고리의 다른 글

Toon/Tf2Shader  (0) 2013.07.19
Toon/Basic with Alpha  (0) 2013.07.19
Toon/Lighted with Alpha  (0) 2013.07.19
toon-water shader  (0) 2012.11.07
AlphaVertexColor  (0) 2012.11.04
Posted by blueasa
, |

Mathf.SmoothDamp

Unity3D/Math / 2012. 11. 6. 00:00

Mathf.SmoothDamp



함수 원형


static function SmoothDamp ( current : float, 

                                          target : float, 

                                          ref currentVelocity : float, 

                                          smoothTime : float, 

                                          maxSpeed : float = Mathf.Infinity, 

                                          deltaTime : float = Time.deltaTime) : float Parameters

    


매개변수


current             : 현재 위치 

target               : 타겟 위치

currentVelocity  : 호출할때마다 이 함수에 의해 변경( 계산 )되는 현재속도

smoothTime      : 현재 위치에서 목적 위치까지 이르는데 걸리는 시간. 이 값이 작을수록 목적지에 빠르게 도착한다.

maxSpeed        : 스피드의 상한치.

deltaTime         : By default Time.deltaTime.



설명


Gradually changes a value towards a desired goal over time.


The value is smoothed by some spring-damper like function, which will never overshoot.

The function can be used to smooth any kind of value, positions, colors, scalars.


시간 내에 정해진 목표(값)로 점점 값을 변화시킨다.


결코 특정값을 넘지 않게 하는 스프링 제동 기능으로써 값을 자연스럽게 변화하게 한다.

이 함수는 어떤 종류의 값, 위치, 색, 스칼라등의 어떤 종류의 값이라도 자연스럽게 변화시키는데 이용될수 있다.





사용예


using UnityEngine;

using System.Collections;


public class example : MonoBehaviour {


    public Transform target;

    public float smoothTime = 0.3F;

    private float yVelocity = 0.0F;


    void Update() {

        float newPosition = Mathf.SmoothDamp(transform.position.y, target.position.y, ref yVelocity, smoothTime);

        transform.position = new Vector3(transform.position.x, newPosition, transform.position.z);

    }

}





이 함수를 이용하는 목적은 자연스러운( 부드러운 ) 감속, 가속 효과를 얻기 위함이다.

'럽츠 대탈출' 튜토리얼 에선 주인공 캐릭터를 부드럽게 따라오는 카메라의 움직임

- GPG1권에 나온 용수철 카메라 움직임

을 위해 이 함수가 사용되었다.


보통 이 함수는 다음의 형식으로 사용된다.


void Update()

{  

    ...

    current = Mathf.SmoothDamp( current, target, velocity, smoothTime );

    ...

}


시간(smoothTime)이 일정 하다면 시간이 흐를수록 

current 와 target 간의 차이가 줄어들어 결국 속도가 점점 줄어들게 될것이며,

이것을 통해 자연스로운 카메라 움직임을 표현할수 있다.


'럽츠 대탈출' 메인 게임 씬 첫 부분을 보면

카메라가 꽤 멀리떨어진 상태에서 시작해 캐릭터에게 일정한 속도로 다가가는 것을 확인할수 있는데

위의 공식대로(Mathf.SmoothDamp)라면 최초 시작 상태에서 target 과 current 의 차이가 상대적으로 크므로 

속도가 엄청 빨라야할것 같지만

- 시간은 항상 일정하고 거리차( 캐릭터와 카메라 )는 최초 시작이 가장 크므로

일정 기간 동안 속도의 변화(방향은 제외)는 없는 편이다.


이것은 smoothTime 의 다음 매개변수인 maxSpeed 의 역할 덕분인데

현재계산된 속도가 maxSpeed 값을 넘지 못하게 처리된다.


<출처: Unity Script Reference >



출처 : http://blog.naver.com/kzh8055/140154419294

반응형
Posted by blueasa
, |

유니티 NGUI 에서 라벨에 한글 적용하기(1)


유니티 NGUI 에서 라벨에 한글 적용하기(2)


반응형

'Unity3D > NGUI' 카테고리의 다른 글

NGUI Virtual Joystick  (1) 2012.12.05
스크롤/드래그 이벤트를 받는 방법  (0) 2012.11.13
NGUI - Sticky Floating Text  (0) 2012.10.28
NGUI: HUD Text  (0) 2012.10.26
NGUI와 NGUI: HUD Text 패키지 임포트 시 에러 문제..  (0) 2012.10.25
Posted by blueasa
, |

유니티엔진에서 일반적인 Timer()함수 대신에

MonoBehaviour 가 제공하는Invoke() 함수가 있다.

 

아래 함수들을 참조할 것

 

Invoke(methodName:string, time:float)
methodName 메소드를 time 초 후 호출합니다.


InvokeRepeating(methodName:string, time:float, repeatRate:float)
methodName 메소드를 time 초 후 호출합니다.
첫 호출 후 repeatRate 초 마다 반복 호출합니다.


CancelInvoke()
이 스크립트에 있는 모든 Invoke 를 취소합니다.
CancelInvoke(methodName:string)
이 스크립트에 있는 methodName 을 호출하는 모든 Invoke 를 취소합니다.

 



출처 : http://blog.naver.com/limik94/20127438317

반응형

'Unity3D' 카테고리의 다른 글

Unity remote 사용방법 (iPhone, Android)  (0) 2012.11.08
Smooth Follow Camera  (0) 2012.11.06
캐릭터 컨트롤 하기  (0) 2012.11.03
빌보드 관련  (0) 2012.11.02
Unity3D로 만드는 초간단 2D 게임 (1)  (0) 2012.11.02
Posted by blueasa
, |

1) Layer 단위로 충돌을 막을 때..


 Layer를 생성 & 셋팅 하고, 충돌을 안하고 싶은 레이어들을 셋팅해 준다.


Physics.IgnoreLayerCollision(LayerMask.NameToLayer("MonsterBody"), LayerMask.NameToLayer("MonsterBody"), true); 


위 소스는 MonsterBody끼리 충돌을 방지한다.

예를들어 플레이어가 박스등에 부딪히고 싶지 않다면..


Physics.IgnoreLayerCollision(LayerMask.NameToLayer("Character"), LayerMask.NameToLayer("Box"), true); 


이런 식으로 하면 된다.


[추가]

충돌을 안하게 했던 부분을 다시 충돌하게 하려면 3번째 매개변수 값을 false로 넣으면 된다.

Physics.IgnoreLayerCollision(LayerMask.NameToLayer("MonsterBody"), LayerMask.NameToLayer("MonsterBody"), false); 



참조1 : http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=20010&sca=UNITY&sfl=wr_subject%7C%7Cwr_content&stx=%EC%B6%A9%EB%8F%8C&sop=and&page=2&currentId=44


참조2 : http://www.devkorea.co.kr/reference/Documentation/ScriptReference/Physics.IgnoreLayerCollision.html




2) 각 개체(오브젝트)별로 충돌을 (실시간으로)막고 싶을 때..

  플레이어가 몬스터와 충돌되다가 몬스터를 죽이면 충돌이 안되게 하고 싶어서 이걸 사용했다.

  처음에 Collider 자체를 껐더니 바닥과도 충돌이 안돼서 빠지는 문제 때문에 이걸로 바꿨다.


Physice.IgnoreCollision() 함수를 쓴다.


static function IgnoreCollision (collider1 : Collider, collider2 : Collider, ignore : bool = true) : void


collider1과 collider2를 충돌하지 않게 해준다.


자세한 사항은 아래 참조로..


참조 : http://www.devkorea.co.kr/reference/Documentation/ScriptReference/Physics.IgnoreCollision.html

반응형

'Unity3D > Physics' 카테고리의 다른 글

Raycast  (6) 2013.02.28
Posted by blueasa
, |

AlphaVertexColor

Unity3D/Shader / 2012. 11. 4. 20:39

AlphaVertexColor

An Alpha/VertexLit shader that modulates result with per-vertex colors. Requires dual-texture hardware (NVIDIA TNT2, ATI Rage 128).

See also: VertexColor for a non-alpha version of this shader.

Invalid language.

You need to specify a language like this: <source lang="html4strict">...</source>

Supported languages for syntax highlighting:

 [Expand


Shader "Alpha/VertexLit Colored" {
Properties {
    _Color ("Main Color", Color) = (1,1,1,1)
    _SpecColor ("Spec Color", Color) = (1,1,1,0)
    _Emission ("Emmisive Color", Color) = (0,0,0,0)
    _Shininess ("Shininess", Range (0.01, 1)) = 0.7
    _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}

SubShader {
    ZWrite Off
    Alphatest Greater 0
    Tags {Queue=Transparent}
    Blend SrcAlpha OneMinusSrcAlpha 
    ColorMask RGB
    Pass {
        Material {
            Shininess [_Shininess]
            Specular [_SpecColor]
            Emission [_Emission]    
        }
        ColorMaterial AmbientAndDiffuse
        Lighting On
        SeperateSpecular On
        SetTexture [_MainTex] {
            Combine texture * primary, texture * primary
        }
        SetTexture [_MainTex] {
            constantColor [_Color]
            Combine previous * constant DOUBLE, previous * constant
        } 
    }
}

Fallback "Alpha/VertexLit", 1
}


출처 : http://wiki.unity3d.com/index.php?title=AlphaVertexColor

반응형

'Unity3D > Shader' 카테고리의 다른 글

Toon/Tf2Shader  (0) 2013.07.19
Toon/Basic with Alpha  (0) 2013.07.19
Toon/Lighted with Alpha  (0) 2013.07.19
toon-water shader  (0) 2012.11.07
스크립트로 Shader 변경  (0) 2012.11.06
Posted by blueasa
, |

캐릭터 컨트롤 하기

Unity3D / 2012. 11. 3. 20:08

캐릭터 컨트롤

 

unity3d 에서 Update() 시 키입력 처리를 통해 캐릭터를 이동할 수 있다.

각 키를 맵핑하고, 해당 이동 처리를 하고, 충돌 영역등을 설정해야 한다.

하늘에 떠있는 오브젝트는 키 입력에 따라 Translate를 해주면 되는데,

캐릭터의 경우 중력도 적용해야 하고, 이동 속도도 제어해야 한다.

 

이것저것 처리할게 많아지는데, unity3d 에서는 이와 관련한 컴포넌트를 제공하고 있다.

 

1. 캐릭터로 사용할 오브젝트(GameObject)를 하나 만든다.

큐브오브젝트를 추가하고, 이름을 Player로 변경했다.

 

2. 라이트 추가

카메라 위치에 Directional light 오브젝트를 추가.

 

3. 스크립트 추가

Component > Physics > Character Controller 추가하고, 스크립트 작성후

컨트롤러와 스크립트를 Player 객체에 적용하게 되는데, 여기서는 스크립트만 작성 후

자동으로 컨트롤러가 추가되도록 구성해본다.

 

Project 에 Scripts 폴더를 하나 만들고, c# 스크립트를 추가.

 

 

스크립트 파일명을 PlayerController로 변경해줬다. 스크립트의 클래스명도 해당 파일명으로

변경해 주어야 한다.

 

 

 

4. 스크립트 작성

이 스크립트가 실행되려면 필요한 요소를 지정한다.

[RequireComponent(typeof(CharacterController))]

 

이 스크립트를 Player 객체에 드래그하여 붙인다.

Player의 인스펙터를 보면 Character Controller와 Player Controller(Script)가 추가된것을

확인할 수 있다.

 

이제 Player 객체를 움직여 보자.

  CharacterController controller = (CharacterController)GetComponent( typeof(CharacterController) );
  controller.transform.Translate( Input.GetAxis("Horizontal"), 
                                             0, 
                                             Input.GetAxis("Vertical"));

 

컨트롤러를 이동하면 Player 객체도 이동하게 된다.

이 내용은 컨트롤러를 사용하지 않고, Player를 직접 Translate해도 동일하다.

이러한 이동은 캐릭터가 어디를 앞으로 하고 있는지 고려치 않은 이동이다.

게임상의 캐릭터는 이동시 방향정보를 가지고 있어야 한다.

 

 

다시, 이번엔 캐릭터가 서 있을 공간을 하나 만들자

바닥으로 사용할 큐브 오브젝트를 하나 추가하고, 캐릭터 아래에 배치했다.

 

 

다시 스크립트 수정

변수 선언

 public float playerSpeed;
 private Vector3 moveDirection = Vector3.zero;
 private float gravity = 20.0f;
 private float jumpHight = 10.0f;
 
 private float verticalSpeed = 0.0f;
 private float moveSpeed = 0.0f;

 

 

몇가지가 변경되었다.

일단, 중력을 위한 변수와 캐릭터의 방향을 위한 변수. 캐릭터의 스피드를 위한

변수가 추가되었다.

 

실행시켜보면 하늘에 있던 캐릭터가 중력의 적용을 받아 아래로 떨어지고,

바닥에서 이동이 이루어지게 된다.

 

방향은 키입력에 따라 변경되고, Player의 방향을 설정한 뒤, 컨트롤러의 Move 메쏘드를 통해 이동하게 된다.

 

점프액션을 추가.

 

 

 

간단하게 점프가 추가되었다.

 

 

5. 카메라 기반 위치보정

이제 캐릭터의 이동은 대충 구성되었다. 하지만, 카메라 위치와 관련없이 움직이기때문에

카메라가 반대로 있을경우 키입력도 반대가 되어야 한다. 방향벡터를 결정할때 카메라의

벡터를 곱해 보정을 해야한다.

 

카메라의 전면, 우측 벡터를 사용해 targetDirection을 보정했다.

이제 카메라가 어디 있건 동일한 키로 움직이게 된다.

 

 

 

6. 방향에 따른 이동

비록 큐브이지만 전방을 향한곳이 앞쪽이라고 할 수 있다. 현재는 방향만 바뀔 뿐이지

큐브는 회전하지 않으므로 실제 앞면이 보이지는 않는다.

단순 이동시에는 상관없으나 캐릭터의 경우 해당 방향으로 앞면이 보여져야 한다.

Player를 현재 방향에 맞게 회전시켜보자.

추가적으로 회전할때 부드럽게 회전하도록 Vector3.Lerp 로 방향이 천천히 바뀌도록

구성한다.

 

 




반응형

'Unity3D' 카테고리의 다른 글

Smooth Follow Camera  (0) 2012.11.06
Timer()함수를 대신하는 Invoke()함수  (0) 2012.11.05
빌보드 관련  (0) 2012.11.02
Unity3D로 만드는 초간단 2D 게임 (1)  (0) 2012.11.02
런타임 중 프리팹을 인스턴스화 하기  (0) 2012.10.30
Posted by blueasa
, |

빌보드 관련

Unity3D / 2012. 11. 2. 15:01

빌보드 관련해서 2가지..

1) transform.LookAt(Camera.main.transform);
- 카메라가 어디로 가든 3차원 상에서 항상 카메라를 바라보게 회전한다.(항상 앞만 보임)

2) transform.forward = Camera.main.transform.forward;
- forward를 카메라와 매칭시키고 화면 바깥쪽으로 이동해 보면, 위의 LookAt() 처럼 항상 카메라에 맞게 돌진 않고, 카메라의 forward에 맞춰져 있기 때문에 약간 비스듬하게 보인다.


Health Bar(3D상 화면에 띄워지는 체력 바)는 2)으로 하는게 맞는 것 같다.

참조 : http://clack.tistory.com/77

반응형
Posted by blueasa
, |



링크 : http://mobilism.tistory.com/entry/Unity3D%EB%A1%9C-%EB%A7%8C%EB%93%9C%EB%8A%94-%EC%B4%88%EA%B0%84%EB%8B%A8-2D-%EA%B2%8C%EC%9E%84-1

반응형

'Unity3D' 카테고리의 다른 글

캐릭터 컨트롤 하기  (0) 2012.11.03
빌보드 관련  (0) 2012.11.02
런타임 중 프리팹을 인스턴스화 하기  (0) 2012.10.30
안드로이드 빌드 셋팅하기  (22) 2012.10.25
MonoDevelop에서 디버깅하기  (0) 2012.10.25
Posted by blueasa
, |