Game!

전체 글 (93)

  1. 2017.05.15 [Unity] 유니티 스크립트 함수 호출 순서

    맨날 헷갈려서 정리 @StartUpAwake() ▶ (해당 오브젝트가 두번째 Active 되었을 때 시작하는 위치) ▶ OnEnable() ▶ Start()cf. 1. 비활성화 시(setActice(false)) 오브젝트 Find 불가능2. 비활성화 시 해당 오브젝트의 코루틴 모두 자동 종료3. 오브젝트가 아닌 컴포넌트의 활성/비활성화 할 경우에도 OnEnable/OnDisable 호출된다.> 그러나 코루틴은 살아있다. void Awake():Awake is called when the script instance is being loaded. (스크립트 개체를 로딩 할때 호출)초기화 할 때 사용. Start()와 차이점. Start() 보다 먼저 호출. Awake() 함수는 모든 오브젝트가 초기화된 후..

  2. 2017.03.06 [Unity] animator 메카님 사용 시, 발동된 Trigger 취소하기

    유니티로 애니메이션 메카님 적용을 하고 버튼 키를 빠르게 이것저것 누르다보면이미 발동 된 트리거 애니메이션이 키를 놓았음에도 불구하고 그대로 발동될 때가 있다. 한마디로 트리거가 한발작 늦게 발동하는 상태 특정 조건에서 animator.ResetTrigger("animation name"); 이 코드를 사용하면 이전에 발동된 특정 트리거를 종료시킬 수있다. 아래는 간단한 예제 (점프 키 입력) 점프 트리거 애니메이션이 씹힌 후,(앉기 키 입력) 앉기 이후 일어설 때 점프가 다시 발동된다고 가정 123456789101112131415161718192021222324 void Update(){ Animator anim_; if(Input.GetKey(KeyCode.Space)) { anim_.SetTrigg..

  3. 2017.01.26 [Unity] 애니메이션 클립에 스크립트를 추가한 후 해당 함수 오버라이딩하기

    애니메이션 클립에 스크립트를 추가한 후 해당 함수 오버라이딩하기 유니티에서 메카님을 사용할 경우 각 애니메이션에 따른 스크립팅을 해주고싶을 때가 있습니다. 그럴때 사용하는 방법으로는 해당 애니메이션에 스크립트를 넣어준 후, StateMachineBehaviour 클래스를 상속받으면 됩니다. 1234567using UnityEngine;using System.Collections; public class CTextAnimScript : StateMachineBehaviour{ }Colored by Color Scriptercs 해당 방식으로 사용할 수 잇으며, 5개의 오버라이딩 함수들이 있다.보통 아래 3개의 함수를 가장 많이 사용한다. 함수 정리 참고 : https://docs.unity3d.com/kr..

  4. 2016.12.02 [Unity/UI] Image Sprite 교체하기

    Unity UI 에서 Image 객체를 찾고,스크립트 내에서 Image의 Sprite 교체하는 방법 Canvas - Panel - Image 사용한다고 가정합니다. 1. 스크립트 내에서 Image 변수에 컴포넌트를 할당하고 싶을 경우, - Image 에 userTag1 태그가 되어있다고 가정합니다 1234567891011public class A : MonoBehaviour{ public GameObject imageObj; public Image myImage; Start() { imageObj = GameObject.FindGameObjectWithTag("userTag1"); myImage = imageObj.GetComponent(); }}Colored by Color Scriptercs 2. 스..

  5. 2016.09.09 [Lua] 기초 : if 문법 / end expected near eof

    루아 기초 : if 문법 / end expected near eof 루아 이제 시작했는데 c랑 많이 비슷해서 설렁설렁 읽고 넘어가다가 if / else 문에서 에러를 못찾아서 2시간은 머리 싸맨 것 같다. 루아에서는 함수를 쓸 때 중괄호를 사용하지 않는다. 12345678910111213141516function Test() print("test lua") local a = "Ezreal" if a == "Ezreal" then print(" Yes ") -- elseif a == " Zed " then print(" No ") else print(" love lol ") endendcs 여기서 중요한 것은 elseif 인데 c 에서는 if{ }else if { }else { } 이렇게 사용하지만 루아에..


맨날 헷갈려서 정리





@StartUp

Awake() ▶ (해당 오브젝트가 두번째 Active 되었을 때 시작하는 위치) 

▶ OnEnable() ▶ Start()

cf. 

1. 비활성화 시(setActice(false)) 오브젝트 Find 불가능

2. 비활성화 시 해당 오브젝트의 코루틴 모두 자동 종료

3. 오브젝트가 아닌 컴포넌트의 활성/비활성화 할 경우에도 OnEnable/OnDisable 호출된다.

> 그러나 코루틴은 살아있다.




void Awake():Awake is called when the script instance is being loaded. (스크립트 개체를 로딩 할때 호출)

초기화 할 때 사용. Start()와 차이점. Start() 보다 먼저 호출. Awake() 함수는 모든 오브젝트가 초기화된 후 호출되기 때문에, 다른 오브젝트에 메시지를 보내거나 FindWithTag 같은 함수를 안전하게 사용할 수 있음. 

Start()함수는 Update함수가 호출되기 직전에 호출. 한번만 호출 됨. 

Awake 함수와의 차이는 Start 함수는 스크립트가 켜져있을 때만 호출된다는 것!!





@Updates

FixedUpdate() ▶ Update() ▶ LateUpdate()






해당 게시글은 작성자가 빠르게 찾기 위해 정리한 것입니다.

출처

http://linecode.tistory.com/10

http://supersoftware.tistory.com/entry/




유니티로 애니메이션 메카님 적용을 하고 버튼 키를 빠르게 이것저것 누르다보면

이미 발동 된 트리거 애니메이션이 키를 놓았음에도 불구하고 그대로 발동될 때가 있다.


한마디로 트리거가 한발작 늦게 발동하는 상태



특정 조건에서 


animator.ResetTrigger("animation name");


이 코드를 사용하면 이전에 발동된 특정 트리거를 종료시킬 수있다.



아래는 간단한 예제




(점프 키 입력) 점프 트리거 애니메이션이 씹힌 후,

(앉기 키 입력) 앉기 이후 일어설 때 점프가 다시 발동된다고 가정



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
void Update()
{
    Animator anim_;
 
    if(Input.GetKey(KeyCode.Space))
    {
        anim_.SetTrigger("Jump");    
    }
 
    /// 여러개의 입력을 받는다...
    if(Input.GetKey....)
    ...
    ..
    .
 
    /// Jump 애니메이션이 끝나면 curState를 idle로 바꾼다고 가정
    
    if(cueState == myState.idle)
    {
        anim_.ResetTrigger("Jump");
    }
}
cs




앉기가 끝나고  idle 상태일 때 이전에 발동된 점프 트리거 발동을 취소하는 방법







 

애니메이션 클립에 스크립트를 추가한 후 

해당 함수 오버라이딩하기






유니티에서 메카님을 사용할 경우 각 애니메이션에 따른 스크립팅을 해주고싶을 때가 있습니다.


그럴때 사용하는 방법으로는 해당 애니메이션에 스크립트를 넣어준 후, StateMachineBehaviour 클래스를 상속받으면 됩니다.




1
2
3
4
5
6
7
using UnityEngine;
using System.Collections;
 
public class CTextAnimScript : StateMachineBehaviour
{
    
}
cs




해당 방식으로 사용할 수 잇으며, 5개의 오버라이딩 함수들이 있다.

보통 아래 3개의 함수를 가장 많이 사용한다.


함수 정리 참고 : https://docs.unity3d.com/kr/current/ScriptReference/StateMachineBehaviour.html




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using UnityEngine;
using System.Collections;
 
public class CTextAnimScript : StateMachineBehaviour
{
    public override void OnStateEnter(Animator animator, 
                                    AnimatorStateInfo stateInfo, 
                                    int layerIndex)
    {
        // code...
    }
 
    public override void OnStateUpdate(Animator animator, 
                                    AnimatorStateInfo stateInfo, 
                                    int layerIndex)
    {
        // code...
    }
 
    public override void OnStateExit(Animator animator, 
                                    AnimatorStateInfo stateInfo, 
                                    int layerIndex)
    {
        // code...
    }
}
cs




OnStateEnter() 함수는 해당 애니메이션이 실행된 후 첫 프레임 때 호출됩니다.


OnStateUpdate() 함수는 첫 번째와 마지막을 제외한 모든 프레임 때 호출됩니다.


OnStateExit() 함수는 마지막 프레임에서 호출됩니다.






예제 )


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using UnityEngine;
using System.Collections;
 
public class CTextAnimScript : StateMachineBehaviour
{
 
    public TestPlayerScript test_;    
 
    public override void OnStateEnter(Animator animator, 
                                    AnimatorStateInfo stateInfo, 
                                    int layerIndex)
    {
        if(test_ == null)
        {
            test_ = animator.gameObject.GetComponent<TestPlayerScript>();
        }
    }
}
cs















Unity UI 에서 Image 객체를 찾고,

스크립트 내에서 Image의 Sprite 교체하는 방법





Canvas - Panel - Image 사용한다고 가정합니다.




1. 스크립트 내에서 Image 변수에 컴포넌트를 할당하고 싶을 경우,



- Image 에 userTag1 태그가 되어있다고 가정합니다




1
2
3
4
5
6
7
8
9
10
11
public class A : MonoBehaviour
{
    public GameObject imageObj;
    public Image myImage;
 
    Start()
    {
        imageObj = GameObject.FindGameObjectWithTag("userTag1");
        myImage = imageObj.GetComponent<Image>();
    }
}
cs







2. 스크립트 내에서  Image 그림을 바꾸고 싶을 경우,









Image 안의 Image(Script) 부분 컴포넌트입니다.


그림을 바꿔주고 싶을 때 Source Image 부분을 바꿔줘야하는데,


.png 이미지는 Sprite(2D and UI) 로 설정해두었습니다.




위의 코드에서 추가하였습니다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class A : MonoBehaviour
{
    public GameObject imageObj;
    public Image myImage;
 
    Start()
    {
        imageObj = GameObject.FindGameObjectWithTag("userTag1");
        myImage = imageObj.GetComponent<Image>();
    }
 
 
 
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            Func();
        }
    }
 
 
    void Func()
    {
        mySkimyImage.sprite = 
                        Resources.Load<Sprite>("SkillIcons/Sword_Skill"
                        as Sprite;
    }
}
cs






루아 기초 : if 문법 / end expected near eof




루아 이제 시작했는데 c랑 많이 비슷해서 설렁설렁 읽고 넘어가다가


if / else 문에서 에러를 못찾아서 2시간은 머리 싸맨 것 같다.



루아에서는 함수를 쓸 때 중괄호를 사용하지 않는다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Test()
    print("test lua")
 
    local a = "Ezreal"    
 
    if a == "Ezreal" then
        print(" Yes ")
 
-- << Not else if >>
 
    elseif a == " Zed " then 
        print(" No ")
    else
        print(" love lol ")
    end
end
cs




여기서 중요한 것은 elseif 인데 


c 에서는 


if

{ }

else if { }

else { }


이렇게 사용하지만


루아에서는


if then

elseif then

else

end


이렇게 사용한다.


만약 루아에서 


if then

else if 

else


이렇게 사용했다고 하면,


if then

else if 

else

end

end


end를 2번 붙여줘야한다.


왜냐하면 else if 라고 적었기 때문에

루아에서는 


else

if

이렇게 인식한다


if 문 1개에 end 1개를 붙여야하므로


if가 2개 들어간 것으로 인식하여 end expected near eof 에러를 처리한다.



루아에서는 elseif <<띄어쓰기 안쓰는 것에 주의.