我正在我关于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;
}
}