728x90
728x90

'Game Programming > Unity' 카테고리의 다른 글

Unity - SendMessage, BroadcastMessage, SendMessageUpwards  (0) 2017.06.12
Unity - OSVR 연동하기  (0) 2017.05.29
Unity - 단축키  (0) 2017.05.24
Unity - Logitech Extream 3D Pro 키 세팅  (0) 2017.05.23
Unity - 캐릭터 점프하기  (0) 2017.05.22
728x90

이번에는 원하는 GameObject에 붙어있는 한개 이상의 Script에 구현되어있는 메소드를 호출하는 방법에 대해 이야기 해보겠습니다. 이 방법을 사용하면 해당 GameObject에 실행하고자 하는 메소드를 가진 스크립트가 컴포넌트로 존재하는지 아닌지를 크게 신경쓰지 않고도 호출하는 것이 가능합니다.

public void SendMessage(string methodName, object value = null,
SendMessageOptions options = SendMessageOptions.RequireReceiver);

SendMessage 함수는 현재 스크립트가 실행중인 GameObject에 붙어있는 모든 MonoBehaviour 스크립트의 원하는 함수를 호출해 줍니다.










하나의 GameObject에 두개의 스크립트를 붙여보았습니다. 그리고 ExampleClass1에서는 SendMessage를 사용하여 ExampleClass2에 있는 메소드를 호출해 보겠습니다.





















SendMessage를 호출할때는 파라미터를 가지고 있더라도 수신하는 메소드는 파라미터를 받지 않음으로써 넘어올 파라미터를 무시할 수 있습니다. 다음의 코드는 문제 없이 ApplyDamage() 메소드가 호출됩니다.





SendMessage는 .Net 리플렉션을 통하여 구현됩니다. 때문에 처음 찾게 되는 같은 이름을 가진 메소드를 실행하게 되며 만약 메소드 오버로딩이 되어있는 상태라면 정상적으로 동작하지 않게 됩니다.







public void SendMessageUpwards(string methodName, object value = null,
SendMessageOptions options = SendMessageOptions.RequireReceiver);

이번에는 SendMessageUpwards 메소드에 대해 알아보겠습니다. 기본적으로 SendMessage 와 동일하게 동작하지만 자신(GameObject)를 포함하여 부모 GameObject까지 메시지를 전달합니다.




위의 스크린샷과 같이 두개의 GameObject를 부모 자식 형태로 배치를 해보았습니다. 스크립트는 다음과 같이 부여하였습니다.













public void BroadcastMessage(string methodName, object parameter = null,
SendMessageOptions options = SendMessageOptions.RequireReceiver);

이번에는 위에서 설명한 SendMessageUpwards와 반대로 동작하는 메소드입니다. BroadcastMessage를 통해 메소드를 호출하게 되면 자기 자신의 GameObject를 포함하여 그의 모든 자식 객체들에게 메시지가 전달됩니다.

이번에는 부모 GameObject에서 BroadcastMessage를 실행해 보겠습니다.











BroadcastMessage 역시 마찬가지로 비활성화되어있는 GameObject는 메시지를 받을 수 없다거나 오버로딩에 정상적으로 대응 할 수 없다는 특징은 같습니다.

SendMessageOptions 은 무엇인가?

위에서 설명한 모든 메소드들의 3번째 인자로 SendMessageOptions 가 있습니다. enum 타입이며 다음과 같은 두가지 타입을 선택할 수 있습니다.

  • RequireReceiver : SendMessage에 대응할 수 있는 수신자가 반드시 있어야 합니다.
  • DontRequireReceiver : SendMessage에 대응할 수 있는 수신자가 없어도 괜찮습니다.

3번째 파라미터를 지정하지 않아도 기본 값은 RequireReceiver이며 이는 한번 메시지 호출이 발생하면 누군가는 그것을 받아서 처리를 해주어야 한다는것을 의미합니다. 만약에 대응되는 메소드가 존재하지 않는다면 오류가 발생하게 됩니다.




하지만 DontRequireReceiver 는 아무도 처리하지 않아도 문제가 되지 않습니다. Optional한 처리를 하는 경우 쓸만한 옵션일 것 같습니다.


출처 : http://theeye.pe.kr/archives/2742

728x90

'Game Programming > Unity' 카테고리의 다른 글

Unity - Mono vs IL2CPP  (0) 2024.02.26
Unity - OSVR 연동하기  (0) 2017.05.29
Unity - 단축키  (0) 2017.05.24
Unity - Logitech Extream 3D Pro 키 세팅  (0) 2017.05.23
Unity - 캐릭터 점프하기  (0) 2017.05.22
728x90

그냥 단순하게 책을 따라하면 Unity에 OSVR이 자동으로 연동 될 줄 알았는데... 아닌가보다....


아래 설치 글은 OSVR 자체는 잘 설치해서 동작하고 있다는 가정하에 유니티에 연동하는 방법만 있다.


OSVR 자체는 알아서 설치하자...





OSVR 개발자 포탈 : http://osvr.github.io/



설치 방법


1. 아래 빨간표시를 클릭하자.





2. Download Unity Snapshot Builds를 클릭하자.




3. 알아서 최신 버전을 받자.






4. 유니티 패키지를 현재 작업중인 프로젝트에 추가하자.





5. 유니티 프로젝트에 OSVRUnity 추가 된 것을 확인하고,

   ClientKit과 VRDisplayTracked를 Hierarchy에 추가하자.




6. 이제 실행하면 유니티에서 다음과 같이 화면이 두개로 나오면서 OSVR의 회전 값에 따라 움직인다.





https://github.com/OSVR/OSVR-Unity/blob/master/GettingStarted.md

728x90

'Game Programming > Unity' 카테고리의 다른 글

Unity - Mono vs IL2CPP  (0) 2024.02.26
Unity - SendMessage, BroadcastMessage, SendMessageUpwards  (0) 2017.06.12
Unity - 단축키  (0) 2017.05.24
Unity - Logitech Extream 3D Pro 키 세팅  (0) 2017.05.23
Unity - 캐릭터 점프하기  (0) 2017.05.22
728x90





출처 : https://docs.unity3d.com/kr/current/Manual/UnityHotkeys.html

728x90
728x90

이 조이스틱... 징하다 진짜






728x90

'Game Programming > Unity' 카테고리의 다른 글

Unity - OSVR 연동하기  (0) 2017.05.29
Unity - 단축키  (0) 2017.05.24
Unity - 캐릭터 점프하기  (0) 2017.05.22
Unity - 게임 종료하기  (0) 2017.05.19
Unity - Logo Scene 만들기  (0) 2017.05.19
728x90





라이프 사이클 중에서 Update를 추가하였습니다.

이 곳에 점프키 입력을 받을 것입니다.




이동과 마찬가지로 InputManager 에

 설정되어있는 'Jump'를 사용합니다.


점프는 축 이동이 아니기 때문에 GetButtonDown 을 사용합니다.

키를 눌렀으면 true, 안누르면 false 값을 내어주죠.

이와 같은 입력 방식 함수는 아래와 같습니다.


------------------------------------------------


1-1. GetButton

  : InputManager에 설정된 키 입력 처리.

  : 누르고 있으면 연속적으로 값을 받음.

?

1-2. GetButtonDown

  :  InputManager에 설정된 키 입력 처리.

  : 키를 누를 때만 한번 값을 받음.


1-3. GetButtonUp

  : InputManager에 설정된 키 입력 처리.

  : 눌러진 키를 뗄 때, 한번 값을 받음.


2-1. GetKey

  : 키보드의 KeyCode로 키 입력 처리.

  : 누르고 있으면 연속적으로 값을 받음.

 

2-2. GetKeyDown

  : 키보드의 KeyCode로 키 입력 처리.

  : 키를 누를 때만 한번 값을 받음.


2-3. GetKeyUp

  : 키보드의 KeyCode로 키 입력 처리.

  :  눌러진 키를 뗄 때, 한번 값을 받음.


-------------------------------------------------

 

전역변수 isJumping 은

점프키를 눌렀다는 증거(?)를 저장해두기 위한 변수입니다.

이건 나중에 점프 함수에서 사용할 것입니다.




이제부터 키 입력에 대해서는 모두 Update 안에서 기술합니다.

각각의 프레임 안에서 정확한 입력을 받기 위함이죠.


때문에 5장에서 다루었던 방향키도 모두 Update로 옮겨놓았습니다.

이로서 키 입력과 물리 효과를 완전히 분리했네요.




이제 점프의 물리 로직을 한번 만들어봅시다.


맨 처음에는 점프키를 눌렀냥, 안눌렀냥 조사를 먼저 합니다.

누르지 않았는데 로직이 실행되면 안되니까

return 키워드로 조용히 돌려보냅니다.


마지막 줄은 점프를 한번 완료했으니

점프를 마친 상태로 되돌려주는 것입니다.

(이 로직이 없으면 점프 한번 하는 순간, 우주로 날아갑니다!)


가운데가 실제 점프 로직입니다만,

일단 5장에서 배운 것을 응용해보았습니다.

여기서 생소한 녀석이 보이는데요.




Vector3 에서는 기본 방향값을 제공해주고 있답니다.

우리는 위로 올려줄거니까 up을 사용하겠습니다.


간단하게 점프 로직이 완성되었네요.

이제 게임 안에서 뛰어보겠습니다.





(내가 원하는 점프는 이게 아닌데..) 


점프를 하긴 하는데

순간이동하는 것처럼 무언가 어색한 느낌이 듭니다.


오브젝트를 단순히 높이만큼 이동만 시켜줬기 때문이죠.


그럼 이번엔 다른 방법을 써보겠습니다.





AddForce ( Vector, ForceMode)

이것은 정해준 방향으로 힘을 가해주는 로직입니다.


첫번째 매개변수로 방향값이 있는 벡터를 넣고,

두번째에는 포스모드를 넣어줍니다.




포스모드는 총 4가지가 있는데

우리는 순간적인 힘이 필요하기 때문에

Impulse 모드를 사용하겠습니다.




이제서야 진짜 점프같은 점프를 하네요.

물리엔진을 사용하는 환경에서는 이렇게 포스를 사용하는 쪽이

훨씬 자연스러운 연출을 구현할 수 있답니다.



게임 안에서는 수많은 이동 이벤트가 발생하지요.


리지드바디의 MovePositionAddForce 의 차이점을 잘 이해하신다면,

계획했던 움직임 그대로 구현하실 수 있을 것입니다.


그럼 지금까지의 코드를 한번 주욱 살펴보도록 해요.





캐릭터를 움직이면서 점프하다보면..


캐릭터가 자꾸 넘어질 것이다. 


그것은 RigidBody의 회전축을 고정하지 않았기 때문이다.


아래의 이미지처럼 고정 해주도록 하자.





출처 : http://blog.naver.com/PostView.nhn?blogId=gold_metal&logNo=220472492907&parentCategoryNo=&categoryNo=43&viewDate=&isShowPopularPosts=true&from=search

728x90
728x90

기본적으로 유니티의 어플리케이션을 종료하기 위해선 Application 클래스의 Quit() 함수를 사용하면 된다.


Application.Quit();



그런데 이것은 일반적인 방법으로 실행했을 때에는 처리되지만, 웹이나 유니티에서는 동작하지 않는다.


그래서 Unity에서는 다음과 같이 처리를 해라고 하였다.


http://answers.unity3d.com/questions/161858/startstop-playmode-from-editor-script.html




요약을 해보면 아래와 같다.


  1. //C#
  2. public static class AppHelper
  3. {
  4. #if UNITY_WEBPLAYER
  5. public static string webplayerQuitURL = "http://google.com";
  6. #endif
  7. public static void Quit()
  8. {
  9. #if UNITY_EDITOR
  10. UnityEditor.EditorApplication.isPlaying = false;
  11. #elif UNITY_WEBPLAYER
  12. Application.OpenURL(webplayerQuitURL);
  13. #else
  14. Application.Quit();
  15. #endif
  16. }
  17. }


참고 : http://m.blog.naver.com/yoohee2018/220702704444

728x90
728x90

시작 화면 ( Splash screen ) 그러니까 회사의 로고와 같은 화면을 표시하는 방법입니다. 여기서는 간단하게 시간으로 으로만 처리하는 방법으로 따로 처리하는 것이 없을 경우 사용하는 방법입니다. 


( 후에 프로세서를 추가하는 방법에 관하여 포스팅 하겠습니다. )


동영상 강좌


 기본적으로 모바일에서는 장비별로 적용 방법이 있지만 여기서는 Scene 을 이용한 시작화면을 만드는 방법입니다.

우선 프로젝트를 하나 생성하시고 씬을 아래와 같이 File > New Scene 을 이용하여 2개정도 생성하도록 합니다.


씬의 순서는 시작화면 > 메인 로비 순으로 진행될것 입니다.




그리고 이제 SplashScene 에 들어갈 스크립트를 작성하도록 합니다.





using UnityEngine;

using System.Collections;
 
public class SplashScript_01 : MonoBehaviour 
{ 
    public float delayTime = 3;
 
    // Use this for initialization
    IEnumerator Start () 
{
        yield return new WaitForSeconds( delayTime );
     
        Application.LoadLevel ("LobbyScene");
    }
}




이제 작성한 스크립트를 아래와 같이 SplashScene 의 EventSystem 에 적용하도록 합니다.




public 으로 지정된 Delay time 은 개발자가 설정할수 있게 된 부분입니다.


이제 실행하여 보도록 합니다.


아마 아래와 같은 에러가 발생할 것입니다. 이유는 빌드 셋팅이 되지 않아서 그런대요.




File > BuildSettings... 으로 이동하여 씬( Scene ) 들을 순서에 맞게 드레그 & 드롭 으로 넣어 주도록 합니다. 시작은 SplashScene 이니 0으로 넣어 주시면 됩니다.




이제 다시 실행을 하시면 SplashScene 에서 LobbyScene 로 설정하신 시간 이후 이동하는 것을 확인하실수 있습니다.


아래는 프로젝트에 사용된 Assets 파일 입니다.



01_splash_screen_Assets.zip




출처 : http://www.tutorialbook.co.kr/entry/Unity3D-SplashScreen-%EB%A7%8C%EB%93%A4%EA%B8%B0


728x90

+ Recent posts