```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; } } } ```