98 lines
4.0 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|