Я следую учебному пособию в моем учебном курсе 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;
}
}