Unity 소스가 블락을 파괴해서 조금 있으면 원상태로 돌아갑니다

12106 단어 Unity

개시하다


저번 이후
블록을 파괴하고 원상태로 복원해 보세요.
장거리 달리기 선수라면 좌우 발 옆에 쌓인 나무가 빛깔?그래서 가장 큰 특징은 깎았다는 거예요. 왜 조금 지나면 부활하는지 모르겠어요.애니메이션 효과를 잠시 한쪽에 놓고 이렇게 해 보세요.
빔이 좌우로 움직일 수 있기 때문에 왼쪽 =Z, 오른쪽 =X를 누르면 빔이 나온다.

이번 포인트.

  • 파괴 가능한 블록 지정
  • Physics.Raycast
  • 사용
  • Debug.DrawRay로 Raycast 확인
  • Layer를 변경하여 불필요한 물건에 대한 히트
  • 를 피한다
  • 블락을 숨기고 있다가 원상회복
  • 파괴할 수 있는 블록을 지목합니다.


    어떤 블록을 파괴할 수 있는지 판단하는 방법이 몇 개 있는 것 같아요.
    모처럼그래서 최대한 유니티의 당첨 판정을 사용하기로 했다.
    레이캐스트란 레이(빛)를 캐스트에 던지는 것을 뜻한다
    한 점에서 선을 그어 충돌하는 Object와 장소를 조사하는 기능입니다.
    대략적인 절차는 다음과 같다.
  • "떨어지지 않음"및 "Z 또는 X"을 눌렀을 때
  • 빔이 나타납니다
  • 유니티 소스의 머리 위에서 45도로 비스듬히 내려간 레이카스트
  • 히트를 한 것이 블록이라면 HitGun 메시지를 블록
  • 에 보냅니다.
    다음 코드를 UnityChanDemo1.csUpdate() 방법 아래에 추가합니다.
    hitgun
            // Gun
            int gun = Input.GetKey(KeyCode.Z) ? -1 : Input.GetKey(KeyCode.X) ? 1 : 0;
            if (gun != 0 && !isFalling) {
                RaycastHit hit;
                Vector3 fromPos = transform.position+Vector3.up;
                Vector3 direction = new Vector3(gun, -1, 0);
                float length = 1.8f;
                Debug.DrawRay(fromPos, direction.normalized * length, Color.green, 1, false);
                if (Physics.Raycast(fromPos, direction, out hit, length)) {
                    if (canDestroyBlock(hit.transform)) {
                        hit.transform.gameObject.SendMessage("HitGun");
                    }
                }
            }
    
    마찬가지로 canDestroyBlock()을 추가합니다.
    canDestroyBlock 방법
        private bool canDestroyBlock(Transform block) {
            return 
                block.tag == BLOCK && 
                Mathf.Abs(block.position.x - transform.position.x) < 1.2f &&
                transform.position.y - block.position.y > 0.3;
        }
    
    그나저나 UnityChanDemo1.cs의 전체 상황은 이렇다.

    Physics.Raycast 사용

    Physics.Raycast(始点、方向、Hit時にセットされるObject、判定する距離)
    
    이런 느낌으로 사용하세요.
    히트인 경우 반환 값이 True로 변경되고 hit 객체에 값이 입력됩니다.
    기본적으로 이 Object의 태그가 Block라면 망가뜨릴 수도 있다.
    다만, 고도의 제한이 있어 맞은편 블록을 없애지 않는 사소한 조건도 있다
    실제 파괴할 수 있는지 canDestoryBlock()의 방법으로 상세한 조사를 진행하다.
    고장날 것으로 판단되면 ObjectSendMessage까지 메시지를 보내HitGun.

    Debug.DrawRay로 Raycast 확인


    제작 과정에서 생각한 대로 판정할 수 없는 원인을 조사하거나 레이카스트를 미세하게 조정할 때 실제 레이카스트의 빛을 볼 수 있다면 편리하다.DrawRay를 사용하면 그게 쉬울 거예요.
    Debug.DrawRay(始点、方向、色、表示時間、depthTest [カメラから見えない場合に非表示にするか]))
    
    이렇게 사용하세요.
    다만 이 DrawRay는 Game View에 일반적으로 표시되지 않으므로 주의해야 할 점이 있습니다.
    Game View에 표시하려면 Gizmos 를 사용해야 합니다. (처음에는 이것을 몰랐습니다.)다음 그림의 오른쪽 위 구석을 누릅니다.

    레이어를 바꿔, 쓸데없는 걸 히트로 만들지 마.


    이번에는 유닛 소스의 머리 위로 비스듬히 내려온 라이캐스트.
    실제로 블록을 맞히기 전에 라이캐스트는 유닛 자신에게 부딪힌다.
    나 이거 진짜 찾고 싶은 블락인 줄 몰랐어.또 사다리인 가로대에 부딪힌 것도 문제다.
    이에 따라'Unity','사다리','바'등 세 개의 레이어는 Ignore Raycast라는 이름의 레이어에게 배정됐다.
    Raycast 할 때 거의 이 Layer를 무시했는데 이번에는 딱 좋아요.

    여러 Raycast를 관리하면 Raycast의 다섯 번째 매개 변수에도 LayerMask가 있기 때문에 이것을 사용할 수 있을 것 같다(이번에는 사용하지 않는다).

    Prefab에 수정 사항 적용


    설명이 늦었어요.
    Prefab에서 실체화된 GameObject의 속성(예를 들어 Layer의 변경)을 변경할 때 InspectorApply 단추를 누르면 대본의 Prefab에 반영되어 다른 모든 GameObject에 적용됩니다.편하네.
    반대로 Revert를 누르면 게임 Object에서 원래 Plefab의 속성으로 덮어쓰여 수정됩니다.Select를 누르면 원래 Plefab이 표시됩니다.

    Block 숨기고 있다가 다시 회복


    만약 모든 것이 순조롭게 진행된다면 블록 대상에게 HitGun 메시지를 보낼 것이다.
    하지만 지금은 그것을 처리할 방법이 없기 때문에 Constore에 오류가 표시됩니다.

    Block에 스크립트 추가


    BlockControl.cs라는 C# 스크립트를 작성하여 Block의 아이 큐브와 연결합니다.
    실제 판정(Collider)은 이 큐브가 보유한 것이고, SendMessage의 대상은 이 큐브이기 때문이다.

    다음 처리 추가:.
  • HitGun 메시지를 받은 후 Timer를 설정합니다.이번에는 180프레임(약 3초)이다.
  • Update()에서는 Timer의 값이 하나씩 줄고 0이 아닌 경우collider(충돌 판정), renderer(그리기)는 무효
  • 어쨌든 의도대로 움직이겠습니다.
    BlockControl.cs
    using UnityEngine;
    using System.Collections;
    
    public class BlockControl : MonoBehaviour {
        private const int DISAPPEAR_TIMER_COUNT = 60*3;
        private int disappearTimer = 0;
    
        // Use this for initialization
        void Start () {
        }
    
        // Update is called once per frame
        void Update () {
            if (disappearTimer > 0) {
                disappearTimer--;
            }
            renderer.enabled = collider.enabled = disappearTimer == 0;
        }
    
        void HitGun() {
            if (disappearTimer > 0) {
                return;
            }
            disappearTimer = DISAPPEAR_TIMER_COUNT;
        }
    }
    

    최후


    대충 괜찮나요?만들면 유닛 소스가 블락에 끼어서 꼼짝을 못해요.
    블락이 망가져서 원래 위치로 돌아가고 애니메이션도 만들고 싶네요.
    애니메이션의 과제가 산더미 같아...
    이번에는 여기서 WebPlayer에서 보실 수 있어요.입니다.
    소스 코드는 Giithub에 공개하고 있습니다.입니다.

    좋은 웹페이지 즐겨찾기