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(); } } 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().isFixed) || collision.gameObject.tag == "Limit") { if (!isFixed) HasCollided(); } } private void HasCollided() { Rigidbody2D rb = GetComponent(); Destroy(rb); isFixed = true; LevelManager.instance.SetAsBubbleAreaChild(transform); GameManager.instance.ProcessTurn(transform); } public List GetNeighbours() { List hits = new List(); List neighbours = new List(); 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); } } }