Проблемы с врагами и попаданием - PullRequest
0 голосов
/ 10 ноября 2019

Я следую учебному пособию в моем учебном курсе Unity по Udemy. В этой 2D платформерной игре у вас есть враг-улитка, который в начале игры будет взад и вперед на платформе. Улитка может быть оглушена, если игрок прыгает на нее сверху. После оглушения игрок может оттолкнуть улитку от платформы. Проблема в том, что улитка достигла конца платформы. Он развернется, но не его левая и правая точки попадания. Когда он в конце концов откололся от этого края, трансформации на левой и правой сторонах не в правильных положениях

Я приложил скриншоты улитки до и во время игры вместе с кодом SnailScript. Любые отзывы приветствуются для решения этой проблемы.

Перед тестированием игры: настройка

Во время тестирования игры: проблема с Edge touch

Код SnailScript:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SnailScript : MonoBehaviour
{
    public float moveSpeed = 1f;
    private Rigidbody2D rb;
    private Animator anim;

    private bool moveLeft;
    private bool canMove;
    private bool stunned;
    public LayerMask playerLayer;

    public Transform leftCollision, rightCollision, upCollision, downCollision;
    private Vector3 leftCollisionPos, rightCollisionPos;

    private void Awake()
    {
        rb = GameObject.Find("Snail").GetComponent<Rigidbody2D>();
        anim = GameObject.Find("Snail").GetComponent<Animator>();

        leftCollisionPos = leftCollision.position;
        rightCollisionPos = rightCollision.position;
    }
    // Start is called before the first frame update
    void Start()
    {
        moveLeft = true;
        canMove = true;
    }

    // Update is called once per frame
    void Update()
    {

        if (canMove)
        {
            if (moveLeft)
            {
                rb.velocity = new Vector2(-moveSpeed, rb.velocity.y);
            }
            else
            {
                rb.velocity = new Vector2(moveSpeed, rb.velocity.y);
            }
        }

        CheckCollision();
    }

    void CheckCollision()
    {
        RaycastHit2D leftHit = Physics2D.Raycast(leftCollision.position, Vector2.left, 0.1f, playerLayer);
        RaycastHit2D rightHit = Physics2D.Raycast(rightCollision.position, Vector2.right, 0.1f, playerLayer);

        Collider2D topHit = Physics2D.OverlapCircle(upCollision.position, 0.2f, playerLayer);

        if(topHit != null)
        {
            //collision detected
            if(topHit.gameObject.tag == MyTags.PLAYER_TAG)
            {
                if (!stunned)
                {
                    //bounce player off the snail
                    topHit.gameObject.GetComponent<Rigidbody2D>().velocity =
                        new Vector2(topHit.gameObject.GetComponent<Rigidbody2D>().velocity.x, 7f);
                    //stun snail
                    canMove = false;
                    rb.velocity = new Vector2(0, 0);
                    anim.Play("stun");
                    stunned = true;

                    //BEETLE CODE HERE
                }
            }
        }

        if (leftHit)
        {
            if(leftHit.collider.gameObject.tag == MyTags.PLAYER_TAG)
            {
                print("Player hit snail's left side");
                if (!stunned)
                {
                    //apply damage to player
                }
                else
                {
                    //player can move snail
                    rb.velocity = new Vector2(15f, rb.velocity.y);
                }
            }
        }
        if (rightHit)
        {
            if (rightHit.collider.gameObject.tag == MyTags.PLAYER_TAG)
            {
                print("Player hit snail's right side");
                if (!stunned)
                {
                    //apply damage to player
                }
                else
                {
                    rb.velocity = new Vector2(-15f, rb.velocity.y);
                }
            }
        }
        //if we don't detect collision any more, then we do the following

        if (!Physics2D.Raycast(downCollision.position, Vector2.down, 0.05f))
        {
            ChangeDirection();
        }
    }

    void ChangeDirection()
    {
        moveLeft = !moveLeft;

        Vector3 tempScale = transform.localScale;

        if (moveLeft)
        {
            tempScale.x = Mathf.Abs(tempScale.x);

            leftCollision.position = rightCollisionPos;
            rightCollision.position = leftCollisionPos;

        }
        else
        {
            //flip snail and swap transforms
            tempScale.x = -Mathf.Abs(tempScale.x);

            leftCollision.position = rightCollisionPos;
            rightCollision.position = leftCollisionPos;
        }

        transform.localScale = tempScale;

    }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...