Files
soccar2d/Assets/Scripts/Puck.cs
2026-01-29 15:31:57 +05:30

125 lines
3.4 KiB
C#

using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;
public class Puck : MonoBehaviour
{
[HideInInspector]public Rigidbody2D rb;
public bool isSelected;
public LineRenderer lineRenderer;
public Team team;
public GameObject redTeamMarker;
public GameObject blueTeamMarker;
public Transform selectedMarker;
public float markerRotateSpeed;
public float markerBounceIntensity;
public float markerBounceSpeed;
Vector3 markerStartScale;
Vector3 startPosition;
float bounceSinA;
void OnValidate()
{
UpdateTeam();
}
void Awake()
{
UpdateTeam();
markerStartScale = selectedMarker.localScale;
rb=GetComponent<Rigidbody2D>();
startPosition = transform.position;
}
void UpdateTeam(){
redTeamMarker.SetActive(team == Team.Red);
blueTeamMarker.SetActive(team == Team.Blue);
}
void Start()
{
GameManager.OnSelectedPuckChanged += OnSelectedPuckChanged;
GameManager.OnTeamChanged += OnTeamChanged;
GameManager.instance.RegisterPuck(this);
}
void OnDestroy()
{
GameManager.OnSelectedPuckChanged -= OnSelectedPuckChanged;
GameManager.OnTeamChanged -= OnTeamChanged;
GameManager.instance.DisposePuck(this);
}
void Update()
{
if (isSelected && lineRenderer != null)
{
Vector3 worldEnd = Camera.main.ScreenToWorldPoint(new Vector3(GameManager.instance.curPosition.x, GameManager.instance.curPosition.y, Camera.main.nearClipPlane));
Vector3 localEnd = transform.InverseTransformPoint(worldEnd);
float clamp = GameManager.instance.puckDragClamp;
localEnd = Vector2.ClampMagnitude(localEnd, clamp);
// Only two points for the line
lineRenderer.positionCount = 2;
lineRenderer.SetPosition(0, Vector3.zero);
lineRenderer.SetPosition(1, new Vector3(localEnd.x, localEnd.y, 0));
}
selectedMarker.gameObject.SetActive(GetMarkerVisibility());
if(GameManager.SelectedTeam == team){
selectedMarker.Rotate(new Vector3(0,0,1), markerRotateSpeed * Time.deltaTime);
bounceSinA += Time.deltaTime * markerBounceSpeed;
float bounce = Mathf.Sin(bounceSinA) * markerBounceIntensity;
selectedMarker.localScale = markerStartScale + (Vector3.one * bounce);
}
}
bool GetMarkerVisibility(){
if(GameManager.isMoving){return false;}
if(GameManager.SelectedTeam == team){
if(GameManager.NoPuckSelected){
return true;
}else{
return isSelected;
}
}
return false;
}
void OnSelectedPuckChanged(Puck puck)
{
isSelected = puck == this;
lineRenderer.enabled = isSelected;
}
void OnTeamChanged(Team team){
}
public void Reset(float duration)
{
StartCoroutine(CoroutineReset(duration));
}
IEnumerator CoroutineReset(float duration){
float t=0;
Vector3 pos1 = transform.position;
Quaternion rot1 = transform.rotation;
while(t<duration){
t+=Time.deltaTime;
transform.position = Vector3.Lerp(pos1, startPosition, t/duration);
transform.rotation = Quaternion.Lerp(rot1, Quaternion.identity, t/duration);
yield return null;
}
}
}
public enum Team{
Red,
Blue
}