So. I wrote scripts that process the sprite of an object based on the angle at which the camera is looking at it (doom-style directional sprites). I’d like you to review my code, point out bad decisions, and generally tell me what you think about it.
The abstract class SpriteRotation contains the logic of assigning a sprite to a SpriteRenderer of an object:
[RequireComponent(typeof(SpriteRenderer))]
public abstract class SpriteRotation : MonoBehaviour
{
[SerializeField] protected Transform character;
protected SpriteRenderer spriteRenderer;
protected Transform cameraTransform;
private void Start()
{
spriteRenderer = GetComponent<SpriteRenderer>();
cameraTransform = Camera.main!.transform;
}
private void Update()
{
spriteRenderer.sprite = GetSectorSprite();
}
protected float GetCameraToCharacterAngle() =>
Vector2.SignedAngle(character.forward.XZ(), cameraTransform.forward.XZ());
protected abstract Sprite GetSectorSprite();
}
The art style of my project requires sprite replacement in both 8 and 16 directions. Therefore, I have child classes from the abstract class that override the method containing the logic of determining the appropriate sprite:
public class EightDirectional : SpriteRotation
{
[SerializeField] private EightDirectionalSpritesContainer spritesContainer;
protected override Sprite GetSectorSprite()
{
var angle = GetCameraToCharacterAngle();
return Mathf.Abs(angle) switch
{
< 22.5f => spritesContainer.up,
< 67.5f => angle < 0 ? spritesContainer.upLeft : spritesContainer.upRight,
< 112.5f => angle < 0 ? spritesContainer.left : spritesContainer.right,
< 157.5f => angle < 0 ? spritesContainer.downLeft : spritesContainer.downRight,
_ => spritesContainer.down
};
}
}
public class SixteenDirectional : SpriteRotation
{
[SerializeField] private SixteenDirectionalSpritesContainer spritesContainer;
protected override Sprite GetSectorSprite()
{
var angle = GetCameraToCharacterAngle();
return Mathf.Abs(angle) switch
{
< 11.25f => spritesContainer.up,
< 33.75f => angle < 0 ? spritesContainer.upLeft0 : spritesContainer.upRight0,
< 56.25f => angle < 0 ? spritesContainer.upLeft : spritesContainer.upRight,
< 78.75f => angle < 0 ? spritesContainer.upLeft1 : spritesContainer.upRight1,
< 101.25f => angle < 0 ? spritesContainer.left : spritesContainer.right,
< 123.75f => angle < 0 ? spritesContainer.downLeft0 : spritesContainer.downRight0,
< 146.25f => angle < 0 ? spritesContainer.downLeft : spritesContainer.downRight,
< 168.75f => angle < 0 ? spritesContainer.downLeft1 : spritesContainer.downRight1,
_ => spritesContainer.down
};
}
}
Sprites are stored in Serializable structures respectively:
[System.Serializable]
public struct EightDirectionalSpritesContainer
{
[FormerlySerializedAs("Up")] public Sprite up;
[FormerlySerializedAs("UpRight")] public Sprite upRight;
[FormerlySerializedAs("Right")] public Sprite right;
[FormerlySerializedAs("DownRight")] public Sprite downRight;
[FormerlySerializedAs("Down")] public Sprite down;
[FormerlySerializedAs("DownLeft")] public Sprite downLeft;
[FormerlySerializedAs("Left")] public Sprite left;
[FormerlySerializedAs("UpLeft")] public Sprite upLeft;
}
[System.Serializable]
public struct SixteenDirectionalSpritesContainer
{
[FormerlySerializedAs("Up")] public Sprite up;
[FormerlySerializedAs("UpRight0")] public Sprite upRight0;
[FormerlySerializedAs("UpRight")] public Sprite upRight;
[FormerlySerializedAs("UpRight1")] public Sprite upRight1;
[FormerlySerializedAs("Right")] public Sprite right;
[FormerlySerializedAs("DownRight0")] public Sprite downRight0;
[FormerlySerializedAs("DownRight")] public Sprite downRight;
[FormerlySerializedAs("DownRight1")] public Sprite downRight1;
[FormerlySerializedAs("Down")] public Sprite down;
[FormerlySerializedAs("DownLeft0")] public Sprite downLeft0;
[FormerlySerializedAs("DownLeft")] public Sprite downLeft;
[FormerlySerializedAs("DownLeft1")] public Sprite downLeft1;
[FormerlySerializedAs("Left")] public Sprite left;
[FormerlySerializedAs("UpLeft0")] public Sprite upLeft0;
[FormerlySerializedAs("UpLeft")] public Sprite upLeft;
[FormerlySerializedAs("UpLeft1")] public Sprite upLeft1;
}
I have a feeling that child classes are superfluous and inappropriate, but at the same time I don’t know how I could change this.
Thank you very much in advance for your reply