117 lines
3.0 KiB
C#
117 lines
3.0 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
using Mirror;
|
|
public class Bubble : NetworkBehaviour
|
|
{
|
|
public float raycastRange = 0.15f;
|
|
public float raycastOffset = 0.6f;
|
|
|
|
public bool isFixed;
|
|
public bool isConnected;
|
|
|
|
public BubbleColor bubbleColor;
|
|
public SpriteRenderer spriteRenderer;
|
|
|
|
void OnValidate()
|
|
{
|
|
if(spriteRenderer == null){
|
|
spriteRenderer = GetComponent<SpriteRenderer>();
|
|
}
|
|
}
|
|
|
|
|
|
public void SetDissolveAmount(float amount)
|
|
{
|
|
if(isServer){
|
|
setDissolveAmount(amount);
|
|
RpcSetDissolveAmount(amount);
|
|
}else{
|
|
CmdSetDissolveAmount(amount);
|
|
}
|
|
}
|
|
|
|
[Command]
|
|
public void CmdSetDissolveAmount(float amount)
|
|
{
|
|
setDissolveAmount(amount);
|
|
RpcSetDissolveAmount(amount);
|
|
}
|
|
|
|
[ClientRpc]
|
|
public void RpcSetDissolveAmount(float amount)
|
|
{
|
|
setDissolveAmount(amount);
|
|
}
|
|
|
|
void setDissolveAmount(float amount)
|
|
{
|
|
spriteRenderer.material.SetFloat("_DissolveAmount", amount);
|
|
}
|
|
|
|
public float GetDissolveAmount()
|
|
{
|
|
return spriteRenderer.material.GetFloat("_DissolveAmount");
|
|
}
|
|
|
|
private void OnCollisionEnter2D(Collision2D collision)
|
|
{
|
|
if ((collision.gameObject.tag == "Bubble" && collision.gameObject.GetComponent<Bubble>().isFixed) || collision.gameObject.tag == "Limit")
|
|
{
|
|
if (!isFixed)
|
|
HasCollided();
|
|
}
|
|
}
|
|
|
|
private void HasCollided()
|
|
{
|
|
Rigidbody2D rb = GetComponent<Rigidbody2D>();
|
|
Destroy(rb);
|
|
isFixed = true;
|
|
LevelManager.instance.SetAsBubbleAreaChild(transform);
|
|
GameManager.instance.ProcessTurn(transform);
|
|
}
|
|
|
|
public List<Transform> GetNeighbours()
|
|
{
|
|
List<RaycastHit2D> hits = new List<RaycastHit2D>();
|
|
List<Transform> neighbours = new List<Transform>();
|
|
|
|
hits.Add(Physics2D.Raycast(new Vector2(transform.position.x - raycastOffset, transform.position.y), Vector3.left, raycastRange));
|
|
hits.Add(Physics2D.Raycast(new Vector2(transform.position.x + raycastOffset, transform.position.y), Vector3.right, raycastRange));
|
|
hits.Add(Physics2D.Raycast(new Vector2(transform.position.x - raycastOffset, transform.position.y + raycastOffset), new Vector2(-1f, 1f), raycastRange));
|
|
hits.Add(Physics2D.Raycast(new Vector2(transform.position.x - raycastOffset, transform.position.y - raycastOffset), new Vector2(-1f, -1f), raycastRange));
|
|
hits.Add(Physics2D.Raycast(new Vector2(transform.position.x + raycastOffset, transform.position.y + raycastOffset), new Vector2(1f, 1f), raycastRange));
|
|
hits.Add(Physics2D.Raycast(new Vector2(transform.position.x + raycastOffset, transform.position.y - raycastOffset), new Vector2(1f, -1f), raycastRange));
|
|
|
|
foreach (RaycastHit2D hit in hits)
|
|
{
|
|
if (hit.collider != null && hit.transform.tag.Equals("Bubble"))
|
|
{
|
|
neighbours.Add(hit.transform);
|
|
}
|
|
}
|
|
|
|
return neighbours;
|
|
}
|
|
|
|
void OnBecameInvisible()
|
|
{
|
|
Destroy(gameObject);
|
|
}
|
|
|
|
public enum BubbleColor
|
|
{
|
|
Blue, Yellow, Red, Purple, Bomb
|
|
}
|
|
|
|
public void OnDrawGizmosSelected()
|
|
{
|
|
Gizmos.color = Color.white;
|
|
foreach (Transform tr in GetNeighbours())
|
|
{
|
|
Gizmos.DrawLine(transform.position, tr.position);
|
|
}
|
|
}
|
|
}
|