2026-05-06 15:07:56 +02:00

98 lines
4.0 KiB
C#

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UMA;
namespace UMA.CharacterSystem.Examples
{
public class DNADelegatesExample : MonoBehaviour
{
public DynamicCharacterAvatar targetAvatar;
//Not actually used
//[Tooltip("Optional. Specify a DynamicDNAConverter to target. If none set the script will target all converters. It will only affect the ones that operate on the dna names you specify in the code below.")]
//public DynamicDNAConverterBehaviour targetDNAConverter;
public DNAPanel delegateDNAEditor;
RaceData lastRace;
Color startingSkinColor = Color.black;
void Awake()
{
if (targetAvatar)
{
targetAvatar.CharacterCreated.AddListener(SetUpDNADelegates);
targetAvatar.CharacterUpdated.AddListener(CheckRaceChange);
}
}
// Use this for initialization
void Start()
{
}
public void CheckRaceChange(UMAData umaData)
{
if (umaData.umaRecipe.raceData)
{
if (umaData.umaRecipe.raceData != lastRace)
SetUpDNADelegates(umaData);
}
}
public void SetUpDNADelegates(UMAData umaData)
{
targetAvatar.RecipeUpdated.RemoveListener(SetUpDNADelegates);
if (umaData.umaRecipe.raceData)
{
lastRace = umaData.umaRecipe.raceData;
foreach (IDNAConverter dcb in umaData.umaRecipe.raceData.dnaConverterList)
{
if(dcb.GetType() == typeof(DynamicDNAConverterBehaviour) || dcb.GetType() == typeof(DynamicDNAConverterController))
{
if (dcb.GetType() == typeof(DynamicDNAConverterBehaviour))
{
(dcb as DynamicDNAConverterBehaviour).AddDnaCallbackDelegate(ChangeCharacterRedness, "skinRedness");
(dcb as DynamicDNAConverterBehaviour).AddDnaCallbackDelegate(ChangeCharacterGreenness, "skinGreenness");
(dcb as DynamicDNAConverterBehaviour).AddDnaCallbackDelegate(ChangeCharacterBlueness, "skinBlueness");
}
else
{
(dcb as DynamicDNAConverterController).AddDnaCallbackDelegate(ChangeCharacterRedness, "skinRedness");
(dcb as DynamicDNAConverterController).AddDnaCallbackDelegate(ChangeCharacterGreenness, "skinGreenness");
(dcb as DynamicDNAConverterController).AddDnaCallbackDelegate(ChangeCharacterBlueness, "skinBlueness");
}
}
}
if (delegateDNAEditor)
{
delegateDNAEditor.Initialize(targetAvatar);
}
startingSkinColor = new Color(targetAvatar.GetColor("Skin").color.r, targetAvatar.GetColor("Skin").color.g, targetAvatar.GetColor("Skin").color.b);
}
}
// the following methods recieve the raw dna value from the DynamicDNAConverterBehaviour (i.e. unchanged dna has a value of 0.5, with a maximum of 1 and a minimum of 0)
public void ChangeCharacterRedness(string affectedDNA, float currentDNAVal)
{
var currenSkinColor = targetAvatar.GetColor("Skin");
var newRed = Mathf.Clamp((float)(((currentDNAVal - 0.5) * 2) + startingSkinColor.r),0,1);
var newSkinColor = new Color(newRed, currenSkinColor.color.g, currenSkinColor.color.b);
targetAvatar.SetColor("Skin", newSkinColor, currenSkinColor.channelAdditiveMask[2], currenSkinColor.channelAdditiveMask[2].a , true);
}
public void ChangeCharacterGreenness(string affectedDNA, float currentDNAVal)
{
var currenSkinColor = targetAvatar.GetColor("Skin");
var newGreen = Mathf.Clamp((float)(((currentDNAVal - 0.5) * 2) + startingSkinColor.g), 0, 1);
var newSkinColor = new Color(currenSkinColor.color.r, newGreen, currenSkinColor.color.b);
targetAvatar.SetColor("Skin", newSkinColor, currenSkinColor.channelAdditiveMask[2], currenSkinColor.channelAdditiveMask[2].a, true);
}
public void ChangeCharacterBlueness(string affectedDNA, float currentDNAVal)
{
var currenSkinColor = targetAvatar.GetColor("Skin");
var newBlue = Mathf.Clamp((float)(((currentDNAVal - 0.5) * 2) + startingSkinColor.b), 0, 1);
var newSkinColor = new Color(currenSkinColor.color.r, currenSkinColor.color.g, newBlue);
targetAvatar.SetColor("Skin", newSkinColor, currenSkinColor.channelAdditiveMask[2], currenSkinColor.channelAdditiveMask[2].a, true);
}
}
}