- Home /
Question by
Vizago · Jul 08, 2020 at 06:19 AM ·
2d gamemovement script2d-physicsmovements
Snake Movement Problem
Well i have these code that should've make my snake move, for note i follow a youtube tutorial Here Is The Link. Well i'm facing a problem as he did at the 58.48 Minute, but i didn't see him giving a solution for it, so i tried it my self. But i ended up with no solution as well, please if you guys could help me i appreciate it so much. I've been stuck in this for weeks already :"
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SnakeMovement : MonoBehaviour
{
[Header("Manager : ")]
[SerializeField] private GameController gameController;
[Space]
[Header("Snake Properties : ")]
[SerializeField] public List<Transform> m_BodyParts = new List<Transform>();
[SerializeField] private float m_MinDistance = 0.25f;
[SerializeField] private float m_DistanceBetweenBodyParts;
[SerializeField] private int m_InitialBody;
[SerializeField] public float m_Speed = 7.0f;
[SerializeField] private float m_RotationSpeed = 50.0f;
[SerializeField] private float m_LerpTimeX;
[SerializeField] private float m_LerpTimeY;
[Space]
[Header("Snake Head Prefab : ")]
public GameObject m_BodyPrefab;
[Space]
[Header("Parts TextAmount Management : ")]
public TextMesh m_PartsAmountTextMesh;
[Space]
[Header("Mouse Control :")]
Vector2 m_MousePreviousPosition;
Vector2 m_MouseCurrentPostion;
[Space]
[Header("Particle System : ")]
public ParticleSystem m_SnakeParticle;
/// <summary>
/// PrivateField
/// </summary>
private Transform m_CurrentBodyPart;
private Transform m_PreviousBodyPart;
private bool m_bFirstPart = true;
private Vector3 m_LastPosition;
private float m_TimeRemaining = 10.0f;
private void Awake()
{
m_bFirstPart = true;
if (m_bFirstPart)
Invoke("SpawnBodyPart", 0.1f);
}
private void Start()
{
m_LastPosition = m_BodyParts[0].transform.position;
}
private void Update()
{
if (GameController.m_GameState == GameController.GameState.GAME)
{
if (m_PartsAmountTextMesh != null)
m_PartsAmountTextMesh.text = m_BodyParts.Count + "";
if (m_BodyParts.Count >= 1)
m_PartsAmountTextMesh.transform.position = new Vector3(m_BodyParts[0].position.x, m_BodyParts[0].position.y + 0.5f, 0);
if (m_BodyParts.Count == 0 && m_bFirstPart == false)
gameController.SetGameOver();
}
float Distance = Vector3.Distance(m_LastPosition, m_BodyParts[0].position);
if (m_TimeRemaining > Time.deltaTime)
{
m_TimeRemaining -= Time.deltaTime;
}
else
{
Debug.Log(Distance);
m_TimeRemaining = 10.0f;
m_LastPosition = m_BodyParts[0].position;
}
}
private void FixedUpdate()
{
if (GameController.m_GameState == GameController.GameState.GAME) Movement();
}
public void SpawnBodyPart()
{
for (int i = 0; i < m_InitialBody; i++)
Invoke("AddBodyPart", 0.1f);
}
public void Movement()
{
float l_CurSpeed = m_Speed;
float l_MaxX = Camera.main.orthographicSize * Screen.width / Screen.height;
if (m_BodyParts.Count > 0)
m_BodyParts[0].Translate(Vector2.up * l_CurSpeed * Time.smoothDeltaTime);
if (m_BodyParts.Count > 0)
{
if (m_BodyParts[0].position.x > l_MaxX)
m_BodyParts[0].position = new Vector3(l_MaxX - 0.1f, m_BodyParts[0].position.y, m_BodyParts[0].position.z);
else if (m_BodyParts[0].position.x < -l_MaxX)
m_BodyParts[0].position = new Vector3(-l_MaxX + 0.1f, m_BodyParts[0].position.y, m_BodyParts[0].position.z);
}
if (Input.GetMouseButtonDown(0))
m_MousePreviousPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
else if (Input.GetMouseButton(0))
{
if (m_BodyParts.Count > 0 && Mathf.Abs(m_BodyParts[0].position.x) < l_MaxX)
{
m_MouseCurrentPostion = Camera.main.ScreenToWorldPoint(Input.mousePosition);
float l_DeltaMousePosition = Mathf.Abs(m_MousePreviousPosition.x - m_MouseCurrentPostion.x );
float l_Sign = Mathf.Sign(m_MousePreviousPosition.x - m_MouseCurrentPostion.x);
Vector2 Position = (Vector2.right * m_RotationSpeed * l_DeltaMousePosition * -l_Sign);
m_BodyParts[0].GetComponent<Rigidbody2D>().AddForce(Position * l_CurSpeed);
m_MousePreviousPosition = m_MouseCurrentPostion;
}
else if (m_BodyParts.Count > 0 && m_BodyParts[0].position.x > l_MaxX)
m_BodyParts[0].position = new Vector3(l_MaxX - 1f, m_BodyParts[0].position.y, m_BodyParts[0].position.z);
else if (m_BodyParts.Count > 0 && m_BodyParts[0].position.x < l_MaxX)
m_BodyParts[0].position = new Vector3(-l_MaxX + 1f, m_BodyParts[0].position.y, m_BodyParts[0].position.z);
}
/*
* To Make The Rest Of The Body Following The Head
*/
for (int i = 1; i < m_BodyParts.Count; i++)
{
m_CurrentBodyPart = m_BodyParts[i];
if (m_BodyParts.Count > 1)
m_PreviousBodyPart = m_BodyParts[i - 1];
Vector3 l_NewPost = m_PreviousBodyPart.position;
l_NewPost.z = m_BodyParts[0].position.z;
Vector3 l_Position = m_CurrentBodyPart.position;
l_Position.x = Mathf.Lerp(l_Position.x, l_NewPost.x, m_LerpTimeX);
l_Position.y = Mathf.Lerp(l_Position.y, l_NewPost.y - m_DistanceBetweenBodyParts, m_LerpTimeY);
m_CurrentBodyPart.position = l_Position;
}
}
/// <summary>
/// Adding Body Part To Snake Body
/// </summary>
public void AddBodyPart()
{
Transform l_NewPart;
if (m_bFirstPart)
{
l_NewPart = (Instantiate(m_BodyPrefab, new Vector3(0, 0, 0), Quaternion.identity) as GameObject).transform;
m_PartsAmountTextMesh.transform.parent.position = l_NewPart.position + new Vector3(0, 1.5f, 0);
m_bFirstPart = false;
Debug.Log(m_bFirstPart);
}
else
{
l_NewPart = (Instantiate(m_BodyPrefab, m_BodyParts[m_BodyParts.Count - 1].position, m_BodyParts[m_BodyParts.Count - 1].rotation) as GameObject).transform;
l_NewPart.SetParent(transform);
}
m_BodyParts.Add(l_NewPart);
}
}
Comment