-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathFishRenderer.cs
More file actions
160 lines (142 loc) · 5.68 KB
/
FishRenderer.cs
File metadata and controls
160 lines (142 loc) · 5.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
using UnityEngine;
namespace AIForOceans
{
/// <summary>
/// Renders a procedurally generated fish from sprite components
/// </summary>
public class FishRenderer : MonoBehaviour
{
[Header("Sprite Renderers")]
public SpriteRenderer bodyRenderer;
public SpriteRenderer eyesRenderer;
public SpriteRenderer mouthRenderer;
public SpriteRenderer dorsalFinRenderer;
public SpriteRenderer pectoralFinFrontRenderer;
public SpriteRenderer pectoralFinBackRenderer;
public SpriteRenderer tailFinRenderer;
public SpriteRenderer scalesRenderer;
[Header("Sprite Arrays (set in inspector or load from Resources)")]
public Sprite[] bodySprites;
public Sprite[] eyesSprites;
public Sprite[] mouthSprites;
public Sprite[] dorsalFinSprites;
public Sprite[] pectoralFinSprites;
public Sprite[] tailFinSprites;
public Sprite[] scalesSprites;
// Current fish data
private OceanObjectData currentData;
/// <summary>
/// Set up the fish visual from data
/// </summary>
public void SetupFish(OceanObjectData data)
{
currentData = data;
if (data.objectType != GameConstants.OceanObjectType.Fish)
{
Debug.LogWarning("FishRenderer.SetupFish called with non-fish object");
return;
}
// Set sprites
SetSpriteIfValid(bodyRenderer, bodySprites, data.bodyIndex);
SetSpriteIfValid(eyesRenderer, eyesSprites, data.eyesIndex);
SetSpriteIfValid(mouthRenderer, mouthSprites, data.mouthIndex);
SetSpriteIfValid(dorsalFinRenderer, dorsalFinSprites, data.dorsalFinIndex);
SetSpriteIfValid(pectoralFinFrontRenderer, pectoralFinSprites, data.pectoralFinIndex);
SetSpriteIfValid(pectoralFinBackRenderer, pectoralFinSprites, data.pectoralFinIndex);
SetSpriteIfValid(tailFinRenderer, tailFinSprites, data.tailFinIndex);
SetSpriteIfValid(scalesRenderer, scalesSprites, data.scalesIndex);
// Apply colors
ApplyColors(data);
}
/// <summary>
/// Set sprite if index is valid
/// </summary>
private void SetSpriteIfValid(SpriteRenderer renderer, Sprite[] sprites, int index)
{
if (renderer == null || sprites == null || sprites.Length == 0)
return;
int safeIndex = Mathf.Clamp(index, 0, sprites.Length - 1);
renderer.sprite = sprites[safeIndex];
}
/// <summary>
/// Apply color tinting to fish parts
/// </summary>
private void ApplyColors(OceanObjectData data)
{
// Body uses primary color
if (bodyRenderer != null)
bodyRenderer.color = data.primaryColor;
// Scales use secondary color
if (scalesRenderer != null)
scalesRenderer.color = data.secondaryColor;
// Fins use fin color
Color finColor = data.finColor;
if (dorsalFinRenderer != null)
dorsalFinRenderer.color = finColor;
if (pectoralFinFrontRenderer != null)
pectoralFinFrontRenderer.color = finColor;
if (pectoralFinBackRenderer != null)
pectoralFinBackRenderer.color = finColor;
if (tailFinRenderer != null)
tailFinRenderer.color = finColor;
// Eyes and mouth stay neutral (white/original)
if (eyesRenderer != null)
eyesRenderer.color = Color.white;
if (mouthRenderer != null)
mouthRenderer.color = Color.white;
}
/// <summary>
/// Set sorting order for all parts
/// </summary>
public void SetSortingOrder(int baseOrder)
{
// Back to front ordering
if (tailFinRenderer != null)
tailFinRenderer.sortingOrder = baseOrder;
if (pectoralFinBackRenderer != null)
pectoralFinBackRenderer.sortingOrder = baseOrder + 1;
if (dorsalFinRenderer != null)
dorsalFinRenderer.sortingOrder = baseOrder + 2;
if (bodyRenderer != null)
bodyRenderer.sortingOrder = baseOrder + 3;
if (scalesRenderer != null)
scalesRenderer.sortingOrder = baseOrder + 4;
if (pectoralFinFrontRenderer != null)
pectoralFinFrontRenderer.sortingOrder = baseOrder + 5;
if (eyesRenderer != null)
eyesRenderer.sortingOrder = baseOrder + 6;
if (mouthRenderer != null)
mouthRenderer.sortingOrder = baseOrder + 7;
}
/// <summary>
/// Flip the fish horizontally
/// </summary>
public void SetFlipped(bool flipped)
{
Vector3 scale = transform.localScale;
scale.x = flipped ? -Mathf.Abs(scale.x) : Mathf.Abs(scale.x);
transform.localScale = scale;
}
/// <summary>
/// Show/hide the fish
/// </summary>
public void SetVisible(bool visible)
{
gameObject.SetActive(visible);
}
/// <summary>
/// Apply a highlight effect (for selection)
/// </summary>
public void SetHighlighted(bool highlighted)
{
float brightness = highlighted ? 1.2f : 1f;
// Brighten all parts slightly
if (bodyRenderer != null)
{
Color c = currentData.primaryColor * brightness;
c.a = 1f;
bodyRenderer.color = c;
}
}
}
}