+ 이 글은 작성자가 직접 공부하고 복습하며 작성한 글입니다. 만약 직접 작성하지 않았다면, 꼭 출처를 밝히겠습니다!

 + 이 글은 개인적인 공부를 바탕으로 작성되었기에, 틀린 부분이 있을 수 있으며, 틀린 부분이 있다면 알려주시면 감사하겠습니다!

 + 이 글을 다른 곳으로 가져가신다면, 꼭 출처를 남겨주세요~

 + '참고사이트'는 공부하기 위해 참고한 사이트들을 모아 둔 것입니다.

 + 혹시라도 문제가 된다면 바로 조취를 취할테니, 말해주시면 감사하겠습니다!


 + Unity Editor에서 설정할 수도 있지만, Script를 통해서도 세부적으로 설정할 수 있다.


 + 여기에 2가지 종류가 있는데, UI에서 입력 처리하는 것과 GUI에서 입력처리하는 것이다.


1) UI에서 입력 처리

 + Selectable.OnPointer 시리즈를 사용함.


 + using UnityEngine.EventSystems; 추가


 + 인터페이스 상속 - IPointerEnterHandler, IPointerExitHandler, ISelectHandler 등, 여러가지가 있다.


 + 인터페이스를 상속하면서 선언해줘야 하는 함수들 작성하기.


 + eventData관련 정보를 확인하고 싶으면, https://docs.unity3d.com/ScriptReference/EventSystems.PointerEventData.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 System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.EventSystems;
using UnityEngine.UI;
 
public class Button : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler {
 
    public void OnPointerEnter(PointerEventData eventData)
    {
        _Image.sprite = _cash_image["exit_btn_highlighted_black"];
    }
 
    public void OnPointerExit(PointerEventData eventData)
    {
        _Image.sprite = _cash_image["exit_btn_normal_black"];
    }
 
    public void OnPointerDown(PointerEventData eventData)
    {
        _Image.sprite = _cash_image["exit_btn_clicked_black"];
    }
}

cs


2) GUI에서 입력 처리

 + MonoBehaviour.OnMouse 시리즈를 사용함


 + Monobehavior에서 상속하는 함수들이므로 따로 작업을 해주지 않아도 된다.


 + 공식 Docs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//Attach this script to a GameObject to have it output messages when your mouse hovers over it.
using UnityEngine;
 
public class OnMouseOverExample : MonoBehaviour
{
// The mesh goes red when the mouse is over it...
    void OnMouseEnter()
    {
        Debug.Log("Mouse is Enter GameObject.");
    }
 
    void OnMouseOver()
    {
        //If your mouse hovers over the GameObject with the script attached, output this message
        Debug.Log("Mouse is over GameObject.");
    }
 
    void OnMouseExit()
    {
        //The mouse is no longer hovering over the GameObject so output this message each frame
        Debug.Log("Mouse is no longer on GameObject.");
    }
}
cs





Copyright © -강정이좋아- 무단 전재 및 재배포는 하지 말아주세요.

'요리 레시피 > Unity' 카테고리의 다른 글

Sprite 바꾸기 - 공식문서  (0) 2018.06.12
Script에서 Resource가져오기  (0) 2018.06.12
[Unity] rigidbody.velocity  (0) 2018.05.14
[UGUI] Progress Bar - Slider  (0) 2018.04.06
[UGUI] NGUI -> UGUI  (0) 2018.04.06

 + 이 글은 작성자가 직접 공부하고 복습하며 작성한 글입니다. 만약 직접 작성하지 않았다면, 꼭 출처를 밝히겠습니다!

 + 이 글은 개인적인 공부를 바탕으로 작성되었기에, 틀린 부분이 있을 수 있으며, 틀린 부분이 있다면 알려주시면 감사하겠습니다!

 + 이 글을 다른 곳으로 가져가신다면, 꼭 출처를 남겨주세요~

 + '참고사이트'는 공부하기 위해 참고한 사이트들을 모아 둔 것입니다.

 + 혹시라도 문제가 된다면 바로 조취를 취할테니, 말해주시면 감사하겠습니다!


  해당 속성은 해당 Object의 rigidbody 속력 벡터를 나타낸다고합니다.


  사용해본 결과, 벡터값을 넣으면, 해당 방향으로 움직이게 합니다. 즉, 그 rigidbody에 말 그대로 속도를 주는 것이죠.


  만약 중력이 작용하고 있다면, 그리고 바닥에 있다면, 그 마찰로 인해 서서히 줄어들겁니다.


  공식 Docs에서는 왠만하면 만지지 말라고합니다. 왜냐하면, 비정상적인 물리 처리가 될 수 있기 때문이라고하네요.


  대표적으로, 다른 물체에 의해 밀리거나, 1인칭 컨트롤러가 Jump할 때 등과 같은 상황에 사용됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
using UnityEngine;
using System.Collections;
 
public class ExampleClass : MonoBehaviour {
    public Rigidbody rb;
    void Start() {
        rb = GetComponent<Rigidbody>();
    }
    void FixedUpdate() {
        if (Input.GetButtonDown("Jump"))
            rb.velocity = new Vector3(0100);
    }
}
cs




Copyright © -강정이좋아- 무단 전재 및 재배포는 하지 말아주세요.

 + 이 글은 작성자가 직접 공부하고 복습하며 작성한 글입니다. 만약 직접 작성하지 않았다면, 꼭 출처를 밝히겠습니다!

 + 이 글은 개인적인 공부를 바탕으로 작성되었기에, 틀린 부분이 있을 수 있으며, 틀린 부분이 있다면 알려주시면 감사하겠습니다!

 + 이 글을 다른 곳으로 가져가신다면, 꼭 출처를 남겨주세요~

 + '참고사이트'는 공부하기 위해 참고한 사이트들을 모아 둔 것입니다.

 + 혹시라도 문제가 된다면 바로 조취를 취할테니, 말해주시면 감사하겠습니다!


[Property?]

 + C#의 기능 중, 유용한 Property(속성)이라는 기능이 있습니다.


 + 이게 무엇이냐면, 일반적으로 다른 언어에서 코딩을 할 때, 데이터의 은닉성을 위해, getter, setter를 많이 씁니다. 이런 데이터 접근 방식을 C#만의 스타일로 편하게 만들어 준 것이 Property입니다~


[Property(속성)]

 + get, set 등 C#의 속성은, 해당 속성을 읽을 때, 실행시킬 구문들을 지정할 때 사용합니다.


 + 함수와는 달라서, 다른 변수들을 집어넣어줄 순 없고, 실행문만 넣을 수 있습니다.


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
30
31
32
namespace CsPractice
{
    class Program
    {
        public int variable { get; set; }
        public int Variable {
            get {
                Console.WriteLine("get 실행");
                return variable + 2;
            }
            set {
                variable -= value;
                Console.WriteLine("set 실행");
                variable--;
            }
        }
 
        static void Main(string[] args)
        {
            Program a = new Program();
 
            a.variable = 1;
            a.Variable = 2;
 
            Console.WriteLine("{0}, {1}", a.variable, a.Variable);
          
        }
    }
}

cs


 + 변경을 허용하기 전에 데이터의 유효성을 검사하거나, 데이터가 실제로 데이터베이스 등의 다른 소스에서 검색되는 클래스에 데이터를 투명하게 공개하고, 데이터 변경 시 이벤트 발생, 다른 필드의 값 변경 등의 작업을 수행할 수 있습니다.

   - (아마도 공개한다는 의미는, 데이터를 집어 넣음으로써, 다른 곳에서도 사용할 수 있게 한다인 것 같다.)


 + virtual, abstract, override, new와 같은 여러 지정자를 사용할 수 있습니다.


virtual)

 + 자식에서 override해주지 않으면, 부모의 property가 실행이되며, override해주면, 선언한 property가 실행됩니다.


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
namespace CsPractice
{
    class root
    {
        public int aaa;
        public virtual int AAA
        {
            get{ return aaa + 1; }
            set{ aaa = value + 1; }
        }
    }
 
    class Program : root
    {
        // public override int AAA { get => base.AAA + 10; set => base.AAA = value; }
        public override int AAA { get { return 111; } set { aaa = 222; } }
 
        static void Main(string[] args)
        {
            Program a = new Program();
 
            a.AAA = 2;
 
            Console.WriteLine("{0}, {1}", a.aaa, a.AAA);
          
        }
    }
}
cs


abstract)

 + abstract class에서 선언한 abstract property를 자식에서 만들어 줘야 합니다.


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
namespace CsPractice
{
    // abstract class 생성.
    abstract class root
    {
        public abstract int aaa { get; set; }
    }
 
    class Program : root
    {
        // override를 통해 추상속성을 구체화
        public override int aaa { get { return 111; } set { aaa = 222; } }
 
        static void Main(string[] args)
        {
            Program a = new Program();
 
            a.aaa = 2;
 
            Console.WriteLine("{0}", a.aaa);
          
        }
    }
}
 
cs


new)

 + 상속받는 property와 이름은 같으나, 완전 다른 property를 생성할 때 사용합니다.


 + 부모로 형변환을 해서 property에 접근하면 안되나? 라고 하실 수 있겠지만, virtual에서는 그렇게하면 자식의 property가 실행되기 때문에, 부모의 root의 property를 사용하는 상황이라면, 자식에서 new를 통해 새로 만들어 줘야 할 겁니다!


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
namespace CsPractice
{
    class root
    {
        public int aaa;
        public int AAA
        {
            get { return aaa + 1; }
            set { aaa = value + 1; }
        }
    }
 
    class Program : root
    {
        // Program class만의 새로운 AAA 선언
        public new int AAA { get { return 111; } set { aaa = 222; } }
 
        static void Main(string[] args)
        {
            Program a = new Program();
 
            // root property 실행
            ((root)a).AAA = 2;
 
            Console.WriteLine("{0}, {1}", ((root)a).AAA, a.AAA);
        }
    }
}
cs


*** 참고해야할 점

 - virtual이나 abstract를 사용할 땐, 재정의 해주는 부분의 한정자를 override로 해줘야 한다.

 - get, set에서 property자체를 사용하려고하면 SO(StackOverflow)에러가 납니다. ( ex) int AAA { get{ return AAA;} set{ AAA=value;} }

 - get, set 둘 다 구현하거나, 구현하지 않거나 하셔야합니다.




Copyright © -강정이좋아- 무단 전재 및 재배포는 하지 말아주세요.

'재료들 > C#' 카테고리의 다른 글

List<>에서 insert하기!  (0) 2018.07.06

+ Recent posts