```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MixtureContainer : MonoBehaviour
{
private int redCount = 0;
private int greenCount = 0;
private int blueCount = 0;
private List<GameObject> substancesInside = new List<GameObject>();
[Header("Visuals")]
public Renderer liquidRenderer;
[Header("Mixing Animation")]
public Transform mixTarget; // Usually the Beaker or LiquidVisual
public float mixSpeedMin = 15f;
public float mixSpeedMax = 35f;
public int minSubstancesToMix = 2;
private bool isMixing = false;
private float currentMixDir = 1f;
private float currentSpeed = 20f;
private Animator animator;
private int lastTotal = 0;
private void Start()
{
animator = GetComponent<Animator>();
if (mixTarget == null) mixTarget = transform;
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("RedSubstance") ||
other.CompareTag("GreenSubstance") ||
other.CompareTag("BlueSubstance"))
{
if (!substancesInside.Contains(other.gameObject))
{
substancesInside.Add(other.gameObject);
UpdateCountsAndColor();
}
}
}
private void OnTriggerExit(Collider other)
{
if (substancesInside.Remove(other.gameObject))
{
UpdateCountsAndColor();
}
}
private void UpdateCountsAndColor()
{
redCount = greenCount = blueCount = 0;
foreach (var obj in substancesInside)
{
if (obj == null) continue;
if (obj.CompareTag("RedSubstance")) redCount++;
else if (obj.CompareTag("GreenSubstance")) greenCount++;
else if (obj.CompareTag("BlueSubstance")) blueCount++;
}
int total = redCount + greenCount + blueCount;
if (total == 0)
{
if (liquidRenderer) liquidRenderer.material.color = Color.clear;
StopMixing();
lastTotal = 0;
return;
}
Color mixed = (Color.red * redCount + Color.green * greenCount + Color.blue * blueCount) / total;
if (liquidRenderer) liquidRenderer.material.color = mixed;
if (total != lastTotal && total >= minSubstancesToMix)
StartMixing();
lastTotal = total;
}
public void Pour()
{
animator?.SetTrigger("Pour");
}
public void OnPourComplete() // Called by animation event
{
// Clear everything that fell out
substancesInside.Clear();
UpdateCountsAndColor();
Debug.Log("Pour complete - mixture reset!");
}
private void StartMixing()
{
if (isMixing) return;
isMixing = true;
currentMixDir = Random.value > 0.5f ? 1f : -1f;
currentSpeed = Random.Range(mixSpeedMin, mixSpeedMax);
StartCoroutine(MixRoutine());
}
private void StopMixing()
{
isMixing = false;
StopAllCoroutines();
}
private IEnumerator MixRoutine()
{
while (isMixing)
{
mixTarget.Rotate(Vector3.up, currentMixDir * currentSpeed * Time.deltaTime, Space.Self);
yield return null;
}
}
}
```