'유닛 할 수 있어요'티셔츠 코드 댓글.

10491 단어 UnityC#
인증 환경: Unity 2017.3.1p4
검증 날짜: 2018/04/23
● 본 기사는 "소재에 충실하라"

'나는 유닛 할 수 있어'티셔츠가 뭐냐면요.


트위터에 유닛 쓰는 동안 화제가 됐던 개그 티셔츠입니다.

뭐가 농담이야?


티셔츠에'나는 유닛 할 수 있어'라는 글과 소스코드가 적혀있어요.
그 인코딩은 소위 '스팸 코드' 이다

어디가 쓰레기야?


먼저 티셔츠의 소스는 다음과 같다.
public float speed = 100;

    void Update () 
    {
        if(GameObject.Find("MainGame").GetComponent<MainGame>().gameStart)
        {
            if(Input.GetButton("Vertical"))
            {
                transform.position += transform.forward * speed;
            }
        }
    }
이 코드가 가장 큰 문제라면 분명히 장난티셔츠인데 번역이 거의 통과됐어요.
(Main Game에 게임스타트 bool이 있으면 통과됩니다. 자세한 내용은 뒤에 설명합니다.)
컴파일을 통해, 그러나 이렇게 많은 코드에서 Unity가 말하는 버드 경험 기술로 막혀 있다.
이 기사에서는 그것에 대한 마술 공연이 있을 것이다.
이것은 단지 개인 평론일 뿐이니 더 이상의 토로와 비난을 환영합니다.

1. 공공의 변수에 초기값을 더하는 것을 주의한다


일단 첫 줄.
public float speed = 100;
언뜻 보기에는 변수의 정의일 뿐이지만 Unity에서는 위험한 점이다.
스크립트가 이 값의 상태로 대상에 부착되면
Inspector에서 100으로 등록
원본 코드의 값이 100에서 10으로 바뀌어도 이 정보는 기존 대상에 반영되지 않는다

그러나 일률적으로 나쁜 일이라고 할 수는 없다.
같은 스크립트에서 스피드만 바꾸려는 경우가 많기 때문이다.
이 경우 조금 어려울 수 있지만 인스펙터로 값을 설정하면 이해하기 쉬워요
[SerializeField]
private float speed = 100;

2. Find 또는 GetComponent 를 Update () 로 부르지 마십시오.


유니티 초콜릿 데킬이 가장 토하고 싶은 부분이다.
 if(GameObject.Find("MainGame").GetComponent<MainGame>().gameStart)
ü MainGame에는 공용 bool gameStart가 있을 수 있습니다.
이 코드에는 Main Game이라는 대상이 있고 구성 요소인 Main Game도 있다.
그러나 Find와 GetComponent는 Unity에서도 상당히 무거운 처리를 한다.
Unity 매뉴얼에서도 프레임마다 이걸 실행하는 걸 추천하지 않아요.
https://docs.unity3d.com/ja/current/ScriptReference/GameObject.Find.html
따라서 이런 코드를 쓸 때 Main Game을 캐시하거나 단식으로 쓰면 성능이 좋아진다.

3. 전진만 가능


여기 규격에 맞는 부분도 되게 커요.
            if(Input.GetButton("Vertical"))
            {
                transform.position += transform.forward * speed;
            }
이 코드는 Vertical입니다. 즉 ↑ 화살표와 w키를 누르면 처리됩니다.
실제 운행 부분은 뒤에 서술할 것이지만, 이 실시 중에는
↓ 화살표나 s 키를 눌러도 앞으로 갈 수 있다
따라서 position에 값을 추가할 때는 Vertical 값을 참조하십시오.
Input.GetAxis("Vertical")
speed에서 ↓ 또는 s(Vertical<=0)를 입력할 때는 아무것도 하지 않는 것이 좋습니다.
동시에델타 타임을 걸면 베젤이 벗겨지는 등의 차이를 줄일 수 있습니다.

4.1 transform의 이동 방법 괜찮아요?


여기서부터 말하기는 좀 어려워요.
Unity에는 객체를 이동하는 여러 가지 방법이 있습니다.
  • transform.Translate
  • transform.position +=
  • transform.position =
  • Rigidbody.MovePosition
  • Rigidbody.AddForce
  • RigidBody.velocity
  • 잠깐만요.그중에 제가 추천하는 건 리디바디예요.velocity 또는 Riidbody.AddForce입니다.

    4.2 왜 리디바디.벨로시티 좋아해요?


    우선 이 유닛은 인코딩이 가능합니다. FPS와 액션 게임의 인코딩이 그렇게 가정되기 때문입니다.
    이 경우 transform.position 및 RiidbodyMovePosition에서는 벽 내에서의 상태와 벽 이탈이 발생하기 쉽습니다.


    그림에서 알기 쉬워,riidbody.velocity의 값을 10000으로 설정합니다.
    transform.Translate면 파란색 블록이 어디로 날아갈지, Righidbody.velocity에서는 벽에 가려집니다.
    이것은transform입니다.Translate 등 대상 대비 전기통신, Righidbody.velocity는 물리 연산에서 실행되기 때문이다.
    (*값이 1000000 등일 경우velocity라도 벽을 통과할 수 있음)
    또한speed의 값이 작은 경우 어떻게 되는지 아래의 그림을 보십시오


    transform.트랜슬레이트는 벽에 열쇠를 놓고 다른 방향으로 불어갔다.
    한순간에 벽에 들어가면 물리 연산이 이상해지기 때문이다.
    따라서 물리적 시뮬레이션 관점에서도 트랜슬레이트 등을 추천하지 않는다.
    그래서 이 부분은 이렇게 쓰는 게 좋을 것 같아요.
    GetComponent<Rigidbody>().velocity = Vector3.forward * Time.deltaTime * speed;
    

    4.3 모바일 시스템은 원래FixedUpdate


    실제로 순서는 앞뒤바뀌지만 물리 연산 시스템을 이동할 때 픽스드 업데이트를 사용하면 행복해진다.
    4.2 Riidbody.velocity에서는 Update()가 벽을 벗어날 위험이 있습니다.


    이것은 물리적 연산이fixed Update의 업데이트 시간에 의해 불리기 때문에 Update에서velocity를 사용하면 동작이 불안정하기 때문이다.
    FixedUpdate는 0.02초에 한 번씩 부르는데, Update가 부르는 시간은 불규칙하기 때문이다.
    여기에는 물리적 시스템이 FixedUpdate로 작동하는 것에 대해 자세히 설명하지 않습니다.이렇게 기억하면 문제 없겠지?

    4.4 Update 입력


    제가 유니티 티셔츠를 할 수 있다면 좀 엉뚱한데, 픽스드 업데이트 같은 경우는...
    Input 학과의 처리는FixedUpdate에 쓰지 않는 것이 가장 좋다.
    간단하게 말하면 입력 이벤트는 프레임 단위로 부른다
    FixedUpdate 시간에 정보를 입력하면 때때로 늦을 수 있기 때문이다.
    따라서 다음과 같은 안전한 입력이 필요하다
    private bool isPress = false;
        void Update(){
             if(Input.GetButton("Vertical")){
                 isPress = true;
             }
        }
        void FixedUpdate(){
           if(isPress){
               GetComponent<Rigidbody>().velocity = Vector3.forward * speed;
               isPress = false;
            }
        }
    
    (4/24 추기)타임.델타 타임은FixedUpdate에 필요하지 않기 때문에 이쪽 코드에서 제외됩니다.
    위에서 말한 바와 같이, 부르는 시기는 고정적이기 때문이다.
    그게 다야.지적이 있다면 댓글을 남겨주시면 격려해 드리겠습니다.

    좋은 웹페이지 즐겨찾기