敌人和生命值翻转问题

我正在我关于Udemy的Unity新手训练营课程中的教程。在此2D平台游戏中,您有一个蜗牛敌人,将在游戏开始时在平台上来回移动。如果玩家跳到蜗牛上面,蜗牛可能会被吓到。震惊后,玩家可以将蜗牛从平台上推下。问题是蜗牛到达平台的末端。他会转身,但不会左右击中。当它最终从该边缘松开时,其左侧和右侧的变换位置不正确

在游戏进行之前和过程中,我都附上了蜗牛的屏幕截图以及snailScript代码。感谢您提供任何反馈来解决此问题。

Before game testing: The setup

During game testing: Edge touch problem

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,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;

    }

}

qinyong4004 回答:敌人和生命值翻转问题

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3128309.html

大家都在问