此为蛇头代码,创建一个Sprite挂在脚本上 运行即可实现贪吃蛇蛇身的运动
using System.Collections.Generic;
using UnityEngine;
public class Snake : MonoBehaviour
{
public GameObject bodySprite;
private float gridMoveTimer;
private float gridMoveTimerMax = 0.3f;
private Vector2 direction;
private Vector2 lastDirection; // 记录蛇的上一次移动方向
private List<Transform> bodies = new List<Transform>();
private void Awake()
{
gridMoveTimerMax = .3f;
gridMoveTimer = gridMoveTimerMax;
bodies.Add(transform);
direction = Vector2.up; // 初始方向是向上
lastDirection = direction; // 初始化为向上
}
private void Update()
{
HandleInput();
HandleGridMovement();
}
private void HandleInput()
{
// 避免蛇反向移动
if (Input.GetKeyDown(KeyCode.UpArrow) && lastDirection != Vector2.down)
{
transform.rotation = Quaternion.Euler(0, 0, 0); // 向上旋转
direction = Vector2.up;
}
if (Input.GetKeyDown(KeyCode.DownArrow) && lastDirection != Vector2.up)
{
transform.rotation = Quaternion.Euler(0, 0, 180); // 向下旋转
direction = Vector2.down;
}
if (Input.GetKeyDown(KeyCode.LeftArrow) && lastDirection != Vector2.right)
{
transform.rotation = Quaternion.Euler(0, 0, 90); // 向左旋转
direction = Vector2.left;
}
if (Input.GetKeyDown(KeyCode.RightArrow) && lastDirection != Vector2.left)
{
transform.rotation = Quaternion.Euler(0, 0, -90); // 向右旋转
direction = Vector2.right;
}
if (Input.GetKeyDown(KeyCode.Space))
{
isSpaceDown = true;
}
}
private bool isSpaceDown;
private void HandleGridMovement()
{
gridMoveTimer += Time.deltaTime;
if (gridMoveTimer >= gridMoveTimerMax)
{
gridMoveTimer = 0;
if (isSpaceDown)
{
// 在尾部添加身体部分
GameObject body = Instantiate(bodySprite,
new Vector3(bodies[^1].position.x, bodies[^1].position.y), Quaternion.identity);
bodies.Add(body.transform);
isSpaceDown = false;
}
// 更新身体的位置
for (int i = bodies.Count - 1; i > 0; i--)
{
bodies[i].transform.position = bodies[i - 1].transform.position;
}
// 更新蛇头的位置
transform.Translate(direction, Space.World);
// 记录当前方向
lastDirection = direction;
}
}
}