프로젝트 제목에 작은 게임 만들기 - 애니메이션 판정

13543 단어 ProjectTinydotsUnity

입문


Project Tiny에서 미니 게임을 제작할 때 사용하는 기능과 고장에 대해 설명합니다.
이번에는 게임의 당첨 판정·애니메이션 설치에 관한 것이다.
저장소는 여기 입니다.

적중 판정


사용할 구성 요소는 RectHitBox 2D입니다.
수첩
https://docs.unity3d.com/Packages/[email protected]/manual/module-hitbox2d.html

판정 방법


Sprite2DRnederer, RectHitBox2D의 솔리드가 서로 접촉하도록 설정된 경우
HitBoxOverlap 구성 요소가 추가되어 비접촉 상태에서 삭제됩니다.
이 HitBoxOverlap 구성 요소가 있는지 확인합니다.
이번 게임에서 캐릭터가 장애물을 접하면 바로 게임이 끝납니다.
HitBoxOverlap이 있으면 게임 종료 플래그를 설정합니다.
GameMain.cs
Entities.ForEach((Entity entity, ref Character character, ref RectHitBox2D rectHitBox2d) => {
    if (EntityManager.HasComponent<HitBoxOverlap>(entity)) {
        isGameOver = true;
    }
});

불편한 점


Collider의 경우 Scene 뷰에서 설정된 치수를 볼 수 있습니다.
RectHitBox2D에는 이러한 미리보기가 없기 때문에 치수 조정이 어렵습니다.
그래서 이 달리기 게임에서 상당히 흐리멍덩하게 판정되었다.

애니메이션


두 가지 구성 요소 사용: Sprite2DSequence 및 Sprite2DSequencePlayer.
인용하다
Sprite2DSequence
Sprite2DSequencePlayer

단계 설정

  • 적절한 솔리드에 Sprite2DSequence 추가
  • 각 프레임에 애니메이션에 사용되는 엘프
  • 설정
  • Sprite2DSequencePlayer를 Sprite2DRenderer가 설정된 엔티티에 추가
  • Sprite2DSequencePlayer의 sequence에서 Sprite2DSequence의 Enitity
  • 설정

    Sprite2DSequencePlayer 필드 설명


    sequence
    Sprite2DSequence가 있는 엔티티
    speed
    재생 속도
    1은 정상 속도입니다.
    1 이하 저속 재생, 1 이상 배속 재생
    time
    현재 시간
    설정 값을 통해 중도 재현 가능
    paused
    일시 중지
    순환 유형
    Name
    Description
    ClampFoever
    재생 후 마지막 프레임 유지
    Loop
    정상 순환
    Once
    한 번만 틀어주세요.
    PingPong
    반복 재생
    PingPongOnce
    PingPong을 한 번만 진행하도록 하겠습니다.

    애니메이션 전환


    애니메이션 구성 요소를 만들고 각 애니메이션에 대해 Sprite2DSequence의 엔티티를 설정할 수 있습니다.
    Animations.cs
    public struct Animations : IComponentData {
        public Entity SequenceIdleEntity;
        public Entity SequenceRunEntity;
        public Entity SequenceJumpEntity;
        public Entity SequenceDeathEntity;
    }
    
    그리고 Character Animation System에서 입력과 상태를 보고 Sprite2DSequencePlayer의 sequence 실체를 변경하여 애니메이션을 전환합니다.
    CharacterAnimationSystem.cs
    public class CharacterAnimationSystem : ComponentSystem {
        protected override void OnUpdate() {
            Entities.ForEach((ref Animations anims) => {
                var sequenceIdleEntity = anims.SequenceIdleEntity;
                var sequenceRunEntity = anims.SequenceRunEntity;
                var sequenceJumpEntity = anims.SequenceJumpEntity;
                var sequenceDeathEntity = anims.SequenceDeathEntity;
                var isGameOver = false;
                var isPlaying = false;
                var begun = false;
                var retry = false;
    
                Entities.ForEach((ref GameState game) => {
                    isGameOver = (!game.GameOverPrev && game.GameOver);
                    isPlaying = game.Playing;
                    begun = game.Begun;
                    retry = game.Retry;
                });
    
                Entities.ForEach((ref Character character, ref Sprite2DSequencePlayer sequencePlayer) => {
                    if (true) {
                        if (isGameOver) {
                            // ゲームオーバー
                            sequencePlayer.time = 0.0f;
                            sequencePlayer.loop = LoopMode.ClampForever;
                            sequencePlayer.sequence = sequenceDeathEntity;
                        }
                        else if (begun) {
                            // ジャンプ
                            sequencePlayer.time = 0.0f;
                            sequencePlayer.loop = LoopMode.ClampForever;
                            sequencePlayer.sequence = sequenceJumpEntity;
                        }
                        else if (retry) {
                            // 走り
                            sequencePlayer.time = 0.0f;
                            sequencePlayer.loop = LoopMode.Loop;
                            sequencePlayer.sequence = sequenceRunEntity;
                        }
                        else {
                            if (!character.jumpingPrev && character.jumping) {
                                // ジャンプ
                                sequencePlayer.time = 0.0f;
                                sequencePlayer.loop = LoopMode.ClampForever;
                                sequencePlayer.sequence = sequenceJumpEntity;
                            }
                            else if (character.jumpingPrev && !character.jumping) {
                                // 着地
                                sequencePlayer.time = 0.0f;
                                sequencePlayer.loop = LoopMode.Loop;
                                sequencePlayer.sequence = sequenceRunEntity;
                            }
                        }
                    }
                });
            });
        }
    }
    

    좋은 웹페이지 즐겨찾기