Hello.
I don’t really have a problem just came in search for a better solution for this kind of situation. I wanted to control my Wall Resizement from one manager. Each of walls would have script attached and it would have stored two kinds of sprites, one for when wall is hidden one when is fully visibile.
Manager is looking like this:
using System.Collections.Generic;
using UnityEngine;
using Unity.Netcode;
public class WallResize : NetworkBehaviour
{
public GameObject player;
[SerializeField] private float radiusTest = 0.5f;
[SerializeField] private float testY = 0.15f;
[SerializeField] private float testX = -0.2f;
public override void OnNetworkSpawn()
{
player = GameObject.FindWithTag("Player");
}
private void Update()
{
GetWalls();
}
private void GetWalls()
{
if (player != null)
{
Vector2 pointA = player.transform.position + new Vector3(testX, testY);
Vector2 pointB = pointA + new Vector2(radiusTest, -radiusTest);
Collider2D[] colliders = Physics2D.OverlapAreaAll(pointA, pointB);
foreach (Collider2D collider in colliders)
{
if (collider.transform.position.z == player.transform.position.z)
{
WallResizeSpriteSetter wallsToResize = collider.GetComponentInChildren<WallResizeSpriteSetter>();
if (wallsToResize != null)
{
wallsToResize.GetIndividualWalls();
}
}
}
}
}
And it resizes a wall down just fine. Thing is when I try to reset it to default size I don’t have an idea of an optimal way to do so. Each wall has this script on it, which takes one side, and changes it’s childre’s sprites accordingly.
using UnityEngine;
public class WallResizeSpriteSetter : MonoBehaviour
{
// Start is called before the first frame update public Sprite[] normalWall;
public Sprite[] normalWall;
public Sprite[] cutOffWall;
public bool wallResized = false;
SpriteRenderer[] spriteRenderers;
public void GetIndividualWalls()
{
for (int i = 0; i < this.transform.childCount; i++)
{
Transform child = this.transform.GetChild(i);
GetIndWallParts(child);
}
}
private void GetIndWallParts(Transform partOfWall)
{
if (partOfWall.gameObject.name.Contains("Wall"))
{
spriteRenderers = partOfWall.GetComponentsInChildren<SpriteRenderer>();
if (wallResized) // this is used with OnTriggerEnter/Exit2D
{
SetSprites(normalWall, spriteRenderers);
}
else
{
SetSprites(cutOffWall, spriteRenderers);
}
}
}
private void SetSprites(Sprite[] sprites, SpriteRenderer[] actualSprites)
{
for (int i = 0; i < actualSprites.Length; i++)
{
if (i < sprites.Length)
{
actualSprites[i].sprite = sprites[i];
actualSprites[i].enabled = true;
}
else
{
actualSprites[i].enabled = false;
}
}
}
}
I’ve managed to make it work with Update() on these scripts but that doesn’t sound very good in terms of potential performance and when more walls will be present.
Also OnTriggerExit2D and OnTriggerEnter2D works just fine, but again I think there is better way to do so.
May current way of finding collisions for this problem looks very promising but can’t really grasp it.