예를들어 오브젝트의 로테이션값을 x = 35로 스크립트 내에서 못박아버리고싶은데
this.transform.eulerAngles.x = 35.0f;
transform.rotation.x = 35.0f
이러면 변수가 아니라 바꿀수가 없다고 하더라고
저 값을 아예 바꿀수있는 함수는 뭐가있어?
예를들어 오브젝트의 로테이션값을 x = 35로 스크립트 내에서 못박아버리고싶은데
this.transform.eulerAngles.x = 35.0f;
transform.rotation.x = 35.0f
이러면 변수가 아니라 바꿀수가 없다고 하더라고
저 값을 아예 바꿀수있는 함수는 뭐가있어?
transform.rotation =new Queternion.Euler(35.f,0,0)
그거 로테이션에서 x값은 읽어오는거 밖에 안됨
아님 Rotate로 돌리던지
이것때문에 내가 중갤에 강좌쓸때 처음부터 조작설명안했던거임.일단 니 생각대로 안되는 이유는 기본적으로 클래스는 말이야 변수가 private이여야되.아니 그럼 값을 어떻게 집어넣냐c++기준으로 int GetMyData() 혹은 void SetMyData(int nData)이런식으로 GetSet함수를 만들어서 부름, 즉 값을 함부러 쓰지 않고행위에대한 기록을 해서 함수로 하여금 사용해 객체의 캡슐화를 유지하는 사상임.
c#의경우는 getset함수를 매번 만들기 졷같으니까 단축 숏컷으로 프로퍼티 라는것을 만들어줬음. 프로퍼티는 니가 만든 변수에 비쥬얼스튜디오로 alt enter 누루면 똑 하고 만들어짐 혹은 수동으로 int m_nData {get => _nData; set => nData= value ;} 라고 써주거나 연결되는 변수 없이 단독으로 int m_nData{get;set;} 이렇게도 쓸수있음
어쨌든 모든 getset은 이렇게 프로퍼티를 거친다 c#은. 즉 유니티 또한 클래스의 변수를 쓰는게 변수를 직접쓰는게아니라 프로퍼티를 쓰고있는 거고 그증거가 너가 유니티 api 변수에 마우스를 대보면 get set이라고 뜨는거임. 근데 이 프로퍼티가 구조체나 클래스일경우 직접참조 대입이 안됨. 단 set이 뚫려있는 이상 프로퍼티 자체를 = 대입으로 넣는건 가능함. 고로 새로운 쿼터니온 값을 따로 만들어서 넣어줘야함.
맨 첫댓글은 생성자를 부르는게 오일러 static메소드를 부르니까 문법상으로 틀렸고 transform.rotation = new Quaternion (0,0,0,0 ); 가 맞음 당연히 0대신 원하는 각을 넣는건데 이건 쿼터니언이니까 transform.rotation = Quaternion.Euler(12, 2, 1); 이렇게하면 오일러각으로 넣을수 있게됨
같은 원리로 transform.position 도 .x 값을 직접수정못함. 새로운 벡터에 원하는 값을 넣고 대입해주는 식으로 움직이게됨. 참고로 foreach 문도 이렇게 직접참조 대입이 안된다. 그래서 메소드를 만들어서 부르게됨
set이 뚫려있다 이게 뭔말이냐면 get이나 set부분을 아예 지워버리거나 private 설정을 하면 외부에서 해당 행위를 할수없게 원천봉쇄를 하게됨, 그래서 정석인 유니티 필드선언은 [SerializeField] GameObject _playerPrefab; public GameObject m_PlayerPrefab { get => _playerPrefab; } 이런식임. 프리팹은 무조건 레퍼런스로 프로젝트한테 드래그받고 get으로 가져와쓰기만하고 변경할일 없지? 그래서 set부분을 아예 지워서 그런일 없게 만든거야
맨위에 serializefield는 private변수도 인스펙터창에 구멍을 내줌. 반대로 hideinInspector라는 것도 있는데 이건 쓰지마라 가끔 이걸로 코딩하는 애들이있는데 얘네는 드래그하진 않는데 public으로 다른 클래스에 값을 주려는 목적으로 이런거거든. 즉 다시말해 hideininspector을 쓰는 놈은 방금 말한 getset 프로퍼티 개념이 안잡혀있는 놈인거야 또 절대로 쓰면 안되는 궁극적인 이유는 인스펙터창에 debug설정을 걸었을때도 해당 변수를 아예 안보여줘서 디버깅이 안됨
자세한 답변 감사 잘 해결됐어! - dc App
부연설명을 더하자면 개인적으로 private int _number; public int number { get{ return number; }set{ number = var; } }; 그냥 이런식으로 짤꺼면 그건 변수를 public으로 만드는게 나아
애초에 public과 다를바 없고 그러라고 public이 있는거니까.
public이나 구조체 맴버의 직렬화가 필요한데 기획자들이 잘못건들면 안되는건 hideininspector 쓰는게 맞고
유니티에서 transform.position 을 변수로 공개 안하는 이유는 생각해보면 명확해. 포지션이바뀌면 localposition도 바뀌어야되고 자식이 있으면자식 position도 바뀌어야 하기때문
변수로 처리하면 당연히 갱신이 안되니 set 프로퍼티에 그짓거리를 해주근거
와 이건 생각못했음,난 프로퍼티 get이면 get만하고 set이면 set만하라고 배워서