void GenerateUMA() { // Create a new game object and add UMA components to it GameObject GO = new GameObject("MyUMA"); umaDynamicAvatar = GO.AddComponent <UMADynamicAvatar>(); // Initialise Avatar and grab a reference to it's data component umaDynamicAvatar.Initialize(); umaData = umaDynamicAvatar.umaData; // Attach our generator umaDynamicAvatar.umaGenerator = generator; umaData.umaGenerator = generator; // Set up slot Array umaData.umaRecipe.slotDataList = new SlotData[numberOfSlots]; // Set up our Morph reference umaDna = new UMADnaHumanoid(); umaTutorialDNA = new UMADnaTutorial(); umaData.umaRecipe.AddDna(umaDna); umaData.umaRecipe.AddDna(umaTutorialDNA); // Grab a reference to our recipe // var umaRecipe = umaDynamicAvatar.umaData.umaRecipe; //moved to subroutine MakeMale // >>> This is whee the fun will happen according to Secret Anorak <<<< CreateMale(); // Generate Our UMA umaDynamicAvatar.UpdateNewRace(); }
void GenerateUMA() { // Generate new GameObject and add UMA components to it GameObject GO = new GameObject("NPC"); umaDynamicAvatar = GO.AddComponent <UMADynamicAvatar> (); // Initialise Avatar and grab a reference to it's data component umaDynamicAvatar.Initialize(); umaData = umaDynamicAvatar.umaData; // Attach our generator umaDynamicAvatar.umaGenerator = generator; umaData.umaGenerator = generator; // Set up slot Array umaData.umaRecipe.slotDataList = new SlotData[numberOfSlots]; // Set up our Morph references umaDna = new UMADnaHumanoid(); umaData.umaRecipe.AddDna(umaDna); GenerateNPC(); umaDynamicAvatar.animationController = animController; // Generate our UMA umaDynamicAvatar.UpdateNewRace(); GO.transform.parent = this.gameObject.transform; GO.transform.localPosition = Vector3.zero; GO.transform.localRotation = Quaternion.identity; }
void GenerateUMA() { // Create a new game object and add UMA components to it GameObject GO = new GameObject("MyUMA"); umaDynamicAvatar = GO.AddComponent<UMADynamicAvatar>(); // Initialise Avatar and grab a reference to it's data component umaDynamicAvatar.Initialize(); umaData = umaDynamicAvatar.umaData; // Attach our generator umaDynamicAvatar.umaGenerator = generator; umaData.umaGenerator = generator; // Set up slot Array umaData.umaRecipe.slotDataList = new SlotData[numberOfSlots]; // Set up our Morph reference umaDna = new UMADnaHumanoid(); umaTutorialDNA = new UMADnaTutorial(); umaData.umaRecipe.AddDna(umaDna); umaData.umaRecipe.AddDna(umaTutorialDNA); // Grab a reference to our recipe // var umaRecipe = umaDynamicAvatar.umaData.umaRecipe; //moved to subroutine MakeMale // >>> This is whee the fun will happen according to Secret Anorak <<<< CreateMale(); // Generate Our UMA umaDynamicAvatar.UpdateNewRace(); }
private static void SetAvatarDestroyParent(UMADynamicAvatar avatar, bool destroyParent) { var umaEditorAvatarType = GetUMAEditorAvatarType(); var umaEditorAvatar = avatar.GetComponentInChildren(umaEditorAvatarType); umaEditorAvatarType.GetField("destroyParent").SetValue(umaEditorAvatar, destroyParent); }
/* * public AvatarMask currentAvatarMask; * public bool exportRestPose; * public bool T1R; * void Update() { * if (exportRestPose) { * ExportRestPose(); * exportRestPose = false; * } * } * * public void ExportRestPose() { * * List<string> _parts = new List<string>(); * List<Quaternion> _rotations = new List<Quaternion>(); * Vector3 translation = Vector3.zero; * * for (int i = 0; i < currentAvatarMask.transformCount; i++) { * if (!currentAvatarMask.GetTransformActive(i)) continue; * string boneName = currentAvatarMask.GetTransformPath(i).Split(new char[] { '/' }).Last(); * if (!CanonicalRepresentation.HAnimBoneNames.Contains(boneName)) continue; * CanonicalRepresentation.HAnimBones canonicalBone = (CanonicalRepresentation.HAnimBones)System.Enum.Parse(typeof(CanonicalRepresentation.HAnimBones), boneName, false); * MappedBone _ltc = rig.boneMap.FirstOrDefault(m => m.canonicalBoneName == canonicalBone); * if (_ltc == null) continue; * if (T1R && _rotations.Count == 0) { * translation = _ltc.CurrentPositionInCanonical(); * } * * _rotations.Add(_ltc.CurrentRotationInCanonical()); * _parts.Add(boneName); * } * * string res = ""; * string encoding = "R"; * if (T1R) encoding = "T1R"; * * string parts = string.Join(" ", _parts.ToArray()); * res += "<SkeletonPose encoding=\""+encoding+"\" rotationEncoding=\"quaternions\" parts=\""+ parts + "\">\n"; * res += "\t"; * if (T1R) res += translation.ToASAPString() + " "; * res += string.Join(" ", _rotations.ToArray().Select(q => q.ToASAPString()).ToArray()); * res += "\n</SkeletonPose>"; * * Debug.Log(res); * } */ protected override void Awake() { base.Awake(); uma = GetComponent <UMADynamicAvatar>(); uma.CharacterCreated.AddListener(OnCreated); uma.CharacterUpdated.AddListener(OnUpdated); }
void GeneratUMA() { //Add UMA Components to GameObject GO GameObject GO = new GameObject("MyUMA"); umaDynamicAvatar = GO.AddComponent <UMADynamicAvatar> (); //Initialise avatar and grab a reference to it's data component umaDynamicAvatar.Initialize(); umaData = umaDynamicAvatar.umaData; //Attach our generator umaDynamicAvatar.umaGenerator = generator; umaData.umaGenerator = generator; //Setup slot array umaData.umaRecipe.slotDataList = new SlotData[numberOfSlots]; //Setup Morph References umaDna = new UMADnaHumanoid(); umaTutorialDna = new UMADnaTutorial(); umaData.umaRecipe.AddDna(umaDna); umaData.umaRecipe.AddDna(umaTutorialDna); //Make UMA CreateMale(); umaDynamicAvatar.animationController = animController; umaDynamicAvatar.UpdateNewRace(); //Setze Player als Parent GO.transform.parent = this.gameObject.transform; GO.transform.localPosition = Vector3.zero; GO.transform.localRotation = Quaternion.identity; }
private static void SetAvatarDestroyParent(UMADynamicAvatar avatar, bool destroyParent) { var umaEditorAvatarType = typeof(UMAAvatarBase).Assembly.GetType("UMA.PowerTools.UMAEditorAvatar"); var umaEditorAvatar = avatar.GetComponentInChildren(umaEditorAvatarType); umaEditorAvatarType.GetField("destroyParent").SetValue(umaEditorAvatar, destroyParent); }
public void RandomizeAll() { if (generating) { Debug.LogWarning("Can't randomize while generating."); return; } int childCount = gameObject.transform.childCount; for (int i = 0; i < childCount; i++) { Transform child = gameObject.transform.GetChild(i); UMADynamicAvatar umaAvatar = child.gameObject.GetComponent <UMADynamicAvatar>(); if (umaAvatar == null) { continue; } UMAData umaData = umaAvatar.umaData; umaData.umaRecipe = new UMAData.UMARecipe(); RandomizeRecipe(umaData); RandomizeDNA(umaData); if (animationController != null) { umaAvatar.animationController = animationController; } umaAvatar.Show(); } }
void GenerateUMA() { GameObject myUMA = new GameObject("MyUMA"); avatar = myUMA.AddComponent <UMADynamicAvatar>(); avatar.Initialize(); umaData = avatar.umaData; avatar.umaGenerator = generator; umaData.umaGenerator = generator; umaData.umaRecipe = new UMAData.UMARecipe(); umaData.umaRecipe.slotDataList = new SlotData[NUM_SLOTS]; umaDna = new UMADnaHumanoid(); umaTutorialDna = new UMADnaTutorial(); umaData.umaRecipe.AddDna(umaDna); umaData.umaRecipe.AddDna(umaTutorialDna); CreateMale(); avatar.animationController = animController; avatar.UpdateNewRace(); myUMA.transform.parent = this.gameObject.transform; myUMA.transform.localPosition = Vector3.zero; myUMA.transform.localRotation = Quaternion.identity; }
void RpcCreateChar(string savedPlayer, uint id) { //Give it a unique name gameObject.name = "Player|" + netId; ///Setup the UMA basics thisUMA = new GameObject("Player"); UMADynamicAvatar dynamicAvatar = thisUMA.AddComponent <UMADynamicAvatar>(); dynamicAvatar.Initialize(); //IMPORTANT to set this up before loading! dynamicAvatar.animationController = animController; //Load our UMA based on the string we sent var asset = ScriptableObject.CreateInstance <UMATextRecipe>(); asset.recipeString = savedPlayer; dynamicAvatar.Load(asset); //Set upp correct transforms and parent the UMA to our player object. thisUMA.transform.position = Vector3.zero; thisUMA.transform.rotation = transform.rotation; thisUMA.transform.SetParent(transform); //Set up callback to be called when creation is done thisUMA.GetComponent <UMAData>().OnCharacterCreated += UMAFinished; }
void GenerateUMA() { GameObject myUMA = new GameObject("MyUMA"); avatar = myUMA.AddComponent<UMADynamicAvatar>(); avatar.Initialize(); umaData = avatar.umaData; avatar.umaGenerator = generator; umaData.umaGenerator = generator; umaData.umaRecipe = new UMAData.UMARecipe(); umaData.umaRecipe.slotDataList = new SlotData[NUM_SLOTS]; umaDna = new UMADnaHumanoid(); umaTutorialDna = new UMADnaTutorial(); umaData.umaRecipe.AddDna(umaDna); umaData.umaRecipe.AddDna(umaTutorialDna); CreateMale(); avatar.animationController = animController; avatar.UpdateNewRace(); myUMA.transform.parent = this.gameObject.transform; myUMA.transform.localPosition = Vector3.zero; myUMA.transform.localRotation = Quaternion.identity; }
public override void OnInspectorGUI() { serializedObject.Update(); GUILayout.Label("Avatar Name", EditorStyles.boldLabel); avatarName.stringValue = EditorGUILayout.TextArea(avatarName.stringValue); GUILayout.Space(20); #if !StripLitJson GUILayout.BeginHorizontal(); if (GUILayout.Button("Save Avatar Txt")) { UMASaveTool umaSaveTool = (UMASaveTool)target; GameObject gameObject = (GameObject)umaSaveTool.gameObject; UMADynamicAvatar umaDynamicAvatar = gameObject.GetComponent("UMADynamicAvatar") as UMADynamicAvatar; if (umaDynamicAvatar) { var path = EditorUtility.SaveFilePanel("Save serialized Avatar", "Assets", avatarName.stringValue + ".txt", "txt"); if (path.Length != 0) { var asset = ScriptableObject.CreateInstance <UMATextRecipe>(); asset.Save(umaDynamicAvatar.umaData.umaRecipe, umaDynamicAvatar.context); System.IO.File.WriteAllText(path, asset.recipeString); ScriptableObject.Destroy(asset); } } } if (GUILayout.Button("Save Avatar Asset")) { UMASaveTool umaSaveTool = (UMASaveTool)target; GameObject gameObject = (GameObject)umaSaveTool.gameObject; UMADynamicAvatar umaDynamicAvatar = gameObject.GetComponent("UMADynamicAvatar") as UMADynamicAvatar; if (umaDynamicAvatar) { var path = EditorUtility.SaveFilePanelInProject("Save serialized Avatar", avatarName.stringValue + ".asset", "asset", "Message 2"); if (path.Length != 0) { var asset = ScriptableObject.CreateInstance <UMATextRecipe>(); asset.Save(umaDynamicAvatar.umaData.umaRecipe, umaDynamicAvatar.context); AssetDatabase.CreateAsset(asset, path); AssetDatabase.SaveAssets(); } } } GUILayout.EndHorizontal(); GUILayout.Space(20); #endif serializedObject.ApplyModifiedProperties(); }
// Updates the UMA avator attached to this game object private void CreateAndSpawnUMA(string _selectedUma) { UMADynamicAvatar thisUmaDynamicAvator = gameObject.GetComponent <UMADynamicAvatar>(); //Create a UMA avator and bind it to the DynamicAvator of this object UMAGenericHelper.createUMAAvator(AssetLoaderController, _selectedUma, thisUmaDynamicAvator, AvatorController_OnCharacterCreated); }
public void AvatarSetup(){ umaDynamicAvatar = umaData.gameObject.GetComponent<UMADynamicAvatar>(); if(cameraTrack){ cameraTrack.target = umaData.umaRoot.transform; } allDna = umaData.GetAllDna(); BuildSliders(); ReceiveValues(); }
void GenerateUMA() { // Create a new game object and add UMA components to it GameObject GO = new GameObject("MyUMA"); umaDynamicAvatar = GO.AddComponent <UMADynamicAvatar>(); // Initialise Avatar and grab a reference to it's data component umaDynamicAvatar.Initialize(); umaData = umaDynamicAvatar.umaData; //practical guide to uma part 15 uma events https://youtu.be/_k-SZRCvgIk?t=8m20s umaData.OnCharacterCreated += CharacterCreatedCallback; // Attach our generator umaDynamicAvatar.umaGenerator = generator; umaData.umaGenerator = generator; // Set up slot Array umaData.umaRecipe.slotDataList = new SlotData[numberOfSlots]; // Set up our Morph reference umaDna = new UMADnaHumanoid(); umaTutorialDNA = new UMADnaTutorial(); umaData.umaRecipe.AddDna(umaDna); umaData.umaRecipe.AddDna(umaTutorialDNA); // Grab a reference to our recipe // var umaRecipe = umaDynamicAvatar.umaData.umaRecipe; //moved to subroutine MakeMale // >>> This is whee the fun will happen according to Secret Anorak <<<< CreateMale(); // dynamic animation controller umaDynamicAvatar.animationController = animController; // Generate Our UMA umaDynamicAvatar.UpdateNewRace(); // parent the new uma into the host game object GO.transform.parent = this.gameObject.transform; GO.transform.localPosition = Vector3.zero; GO.transform.localRotation = Quaternion.identity; // GO.AddComponent(typeof(Animator)); GO.AddComponent(typeof(UnityEngine.AI.NavMeshAgent)); GO.AddComponent(typeof(Rigidbody)); GO.AddComponent(typeof(CapsuleCollider)); var goCol = GO.GetComponent <CapsuleCollider>(); goCol.center = new Vector3(0f, 0.78f, 0f); goCol.height = 1.7f; goCol.radius = 0.2f; }
public void AvatarSetup() { umaDynamicAvatar = umaData.gameObject.GetComponent<UMADynamicAvatar>(); if(cameraTrack) { cameraTrack.target = umaData.umaRoot.transform; } umaDna = umaData.umaRecipe.umaDna[typeof(UMADnaHumanoid)] as UMADnaHumanoid; ReceiveValues(); }
void GenerateUMA() { //UMA naming // Check a list of UMA objects. int umaCount = GameObject.FindGameObjectsWithTag("UMA").Length; UMAName = "UMA_" + umaCount.ToString(); // Create a new game object and add UMA components to it GameObject GO = new GameObject("myUMA"); GO.tag = "UMA"; umaDynamicAvatar = GO.AddComponent <UMADynamicAvatar>(); // Initialise Avatar and grab a reference to it's data component umaDynamicAvatar.Initialize(); umaData = umaDynamicAvatar.umaData; //practical guide to uma part 15 uma events https://youtu.be/_k-SZRCvgIk?t=8m20s umaData.OnCharacterCreated += CharacterCreatedCallback; // Attach our generator umaDynamicAvatar.umaGenerator = generator; umaData.umaGenerator = generator; // Set up slot Array umaData.umaRecipe.slotDataList = new SlotData[numberOfSlots]; // Set up our Morph reference umaDna = new UMADnaHumanoid(); umaTutorialDNA = new UMADnaTutorial(); umaData.umaRecipe.AddDna(umaDna); umaData.umaRecipe.AddDna(umaTutorialDNA); // Grab a reference to our recipe // var umaRecipe = umaDynamicAvatar.umaData.umaRecipe; //moved to subroutine MakeMale // >>> This is whee the fun will happen according to Secret Anorak <<<< CreateMale(); // dynamic animation controller umaDynamicAvatar.animationController = animController; // Generate Our UMA umaDynamicAvatar.UpdateNewRace(); // parent the new uma into the host game object GO.transform.parent = this.gameObject.transform; GO.transform.localPosition = Vector3.zero; GO.transform.localRotation = Quaternion.identity; }
public void AvatarSetup() { umaDynamicAvatar = umaData.gameObject.GetComponent <UMADynamicAvatar>(); if (cameraTrack) { cameraTrack.target = umaData.umaRoot.transform; } umaDna = umaData.umaRecipe.GetDna <UMADnaHumanoid>(); ReceiveValues(); }
public void AvatarSetup() { umaDynamicAvatar = umaData.gameObject.GetComponent <UMADynamicAvatar>(); if (cameraTrack) { cameraTrack.target = umaData.umaRoot.transform; } allDna = umaData.GetAllDna(); BuildSliders(); ReceiveValues(); }
public override void OnEnter() { dynamicAvatar = ((GameObject)gameObject.Value).GetComponent <UMADynamicAvatar> (); umaData = ((GameObject)gameObject.Value).GetComponent <UMAData> (); var asset = ScriptableObject.CreateInstance <UMATextRecipe>(); asset.Save(umaData.umaRecipe, dynamicAvatar.context); store.Value = asset.recipeString; if (!everyFrame) { Finish(); } }
public CharacterBase (ECharacterResType type, ICharacterSlotOverly _characterSlotOverlay, UMAData _umaData, UMADynamicAvatar _umaDynamicAvatar, CharacterData _characterData) { resType = type; umaContext = UMAContext.FindInstance(); characterSlotOverlay = _characterSlotOverlay; umaData = _umaData; umaDynamicAvatar = _umaDynamicAvatar; characterData = _characterData; }
static void CreatePrimitiveUma()//Spawn a UMA charater and save its recipe in 'SavedRecipes' folder { UMAGenerator generator = MonoBehaviour.FindObjectOfType <UMAGenerator>(); GameObject uma = new GameObject(); uma.name = "A primitive UMA"; UMADynamicAvatar dynamicAvator = uma.AddComponent <UMADynamicAvatar>(); dynamicAvator.loadOnStart = true; //animator string[] animator = AssetDatabase.FindAssets("ThirdPerson t: RuntimeAnimatorController"); // Standard asset animator string animatorPath = AssetDatabase.GUIDToAssetPath(animator[0]); dynamicAvator.animationController = AssetDatabase.LoadAssetAtPath <RuntimeAnimatorController>(animatorPath); //npc movement script UMAController umaController = uma.AddComponent <UMAController>(); umaController.speed = 0.4f; //character controller CharacterController characterController = uma.AddComponent <CharacterController>(); characterController.center = new Vector3(0, 1.0f, 0); //Recipe mixer UMA.Examples.UMARecipeMixer[] recipesMixer = MonoBehaviour.FindObjectsOfType <UMA.Examples.UMARecipeMixer>(); dynamicAvator.context = MonoBehaviour.FindObjectOfType <UMAContext>(); dynamicAvator.umaGenerator = generator; dynamicAvator.Initialize(); UMAData umaData = dynamicAvator.umaData; umaData.atlasResolutionScale = 1.0f; RecipeMixerController recipeMixerController = MonoBehaviour.FindObjectOfType <RecipeMixerController>(); RandomizeRecipe(umaData , recipesMixer , dynamicAvator.context , recipeMixerController.sharedColors); RandomizeDNA(umaData); SaveRecipe(umaData, dynamicAvator.context); dynamicAvator.Show(); }
// An avatar has been selected, setup the camera, sliders, retarget the camera, and adjust the viewport // to account for the DNA slider scroll panel public void AvatarSetup() { umaDynamicAvatar = umaData.gameObject.GetComponent <UMADynamicAvatar>(); if (cameraTrack) { cameraTrack.target = umaData.umaRoot.transform; } umaDna = umaData.GetDna <UMADnaHumanoid>(); umaTutorialDna = umaData.GetDna <UMADnaTutorial>(); SetSliders(); SetCamera(true); }
/** * Given an AssetLoaderController in input,a UMA avator's name and a UMADynamicAvator * create and spawn a new uma avator. It is possible to pass also a callback * that it's executed after the uma avator is created. * */ public static GameObject createUMAAvator(AssetLoaderController assetLoaderController, string umaAvatorName, UMADynamicAvatar umaDynamicAvator, Action <UMAData> onCharacterCreatedCallback = null) { GameObject thisUma = null; if (assetLoaderController != null && umaAvatorName != null && umaDynamicAvator != null) { //Set/spawn a UMA Avator thisUma = umaDynamicAvator.gameObject; UMADynamicAvatar thisUmaDynamicAvator = thisUma.GetComponent <UMADynamicAvatar>(); thisUmaDynamicAvator.context = assetLoaderController.context; thisUmaDynamicAvator.umaGenerator = assetLoaderController.generator; thisUmaDynamicAvator.loadOnStart = false; thisUmaDynamicAvator.Initialize(); thisUmaDynamicAvator.animationController = assetLoaderController.thirdPersonController; UMATextRecipe recipe = assetLoaderController.umaCharactersTemplates[umaAvatorName]; thisUmaDynamicAvator.Load(recipe); if (onCharacterCreatedCallback != null) { thisUma.GetComponent <UMAData>().OnCharacterCreated += onCharacterCreatedCallback; } } else { string partOfTheError = "given in input is null"; if (assetLoaderController == null) { throw new System.ArgumentException("AssetLoader " + partOfTheError); } else if (umaAvatorName == null) { throw new System.ArgumentException("UMA's avator name " + partOfTheError); } else if (umaDynamicAvator == null) { throw new System.ArgumentException("DyanamicAvator " + partOfTheError); } } return(thisUma); }
void Update() { if (!initialized) { UMAData umaData = gameObject.GetComponentInChildren <UMAData>(); if (umaData != null) { umaData.OnCharacterCreated += characterCreated; umaAvatar = gameObject.GetComponentInChildren <UMADynamicAvatar>(); xPos = Screen.width - uiWidth - 25; initialized = true; } } else if ((player != null) && (player.enabled) && setValues) { player.Values = guiValues; } }
void Update() { if (!initialized) { UMAData umaData = gameObject.GetComponentInChildren<UMAData>(); if (umaData != null) { umaData.OnCharacterCreated += characterCreated; umaAvatar = gameObject.GetComponentInChildren<UMADynamicAvatar>(); xPos = Screen.width - uiWidth - 25; initialized = true; } } else if ((player != null) && (player.enabled) && setValues) { player.Values = guiValues; } }
void GenerateUMA() { // Create a new game object and add UMA components to it GameObject GO = new GameObject("MyUMA"); umaDynamicAvatar = GO.AddComponent <UMADynamicAvatar>(); // Initialise Avatar and grab a reference to it's data component umaDynamicAvatar.Initialize(); umaData = umaDynamicAvatar.umaData; //practical guide to uma part 15 uma events https://youtu.be/_k-SZRCvgIk?t=8m20s umaData.OnCharacterCreated += CharacterCreatedCallback; // Attach our generator umaDynamicAvatar.umaGenerator = generator; umaData.umaGenerator = generator; // Set up slot Array umaData.umaRecipe.slotDataList = new SlotData[numberOfSlots]; // Set up our Morph reference umaDna = new UMADnaHumanoid(); umaTutorialDNA = new UMADnaTutorial(); umaData.umaRecipe.AddDna(umaDna); umaData.umaRecipe.AddDna(umaTutorialDNA); // Grab a reference to our recipe // var umaRecipe = umaDynamicAvatar.umaData.umaRecipe; //moved to subroutine MakeMale // >>> This is where the fun will happen according to Secret Anorak <<<< CreateMale(); // dynamic animation controller umaDynamicAvatar.animationController = animController; // Generate Our UMA umaDynamicAvatar.UpdateNewRace(); }
private void UMAFinished(UMAData data) { //Set up Character controller UMADynamicAvatar dynamicAvatar = thisUMA.GetComponent <UMADynamicAvatar>(); UMAData umaData = dynamicAvatar.umaData; CharacterController chc = thisUMA.AddComponent <CharacterController>(); chc.radius = umaData.characterRadius; chc.height = umaData.characterHeight; chc.center = new Vector3(0, chc.height / 2.0f, 0); //Enable Player controller GameObject basePlayer = gameObject; basePlayer.GetComponent <PlayerController>().enabled = true; //Setup player camera GameObject cam = (GameObject)Instantiate(Resources.Load("PlayerCam")); cam.transform.SetParent(thisUMA.transform); }
void InitializeUma() { GameObject go = transform.FindChild("AvatarContainer").gameObject; avatar = go.AddComponent <UMADynamicAvatar> (); avatar.Initialize(); avatar.umaGenerator = generator; avatar.animationController = animController; // TODO make this a server command UMAGeneratorBase.OnUmaAnimatorCreated += heroAnimator.OnUmaAnimatorCreated; avatar.umaData.OnCharacterCreated += OnCharacterCreated; dna = new UMADnaHumanoid(); tutorialDna = new UMADnaTutorial(); data = avatar.umaData; data.umaGenerator = generator; data.umaRecipe.slotDataList = new SlotData[numSlots]; data.umaRecipe.AddDna(dna); data.umaRecipe.AddDna(tutorialDna); ApplyHumanMaleRecipe(); avatar.UpdateNewRace(); }
public void GenerateUMA() { if(this.slotLibrary==null) { findUMAStuff(); } GameObject GO = new GameObject("MyUMA"); umaDynamicAvatar = GO.AddComponent<UMADynamicAvatar>(); this.umaDynamicAvatar.Initialize(); umaData = this.umaDynamicAvatar.umaData; umaDynamicAvatar.umaGenerator = generator; umaData.umaGenerator = generator; umaData.umaRecipe.slotDataList = new SlotData[numberOfSlots]; umaDna = new UMADnaHumanoid(); umaData.umaRecipe.AddDna(umaDna); CreateMale(); umaDynamicAvatar.animationController = this.animController; umaDynamicAvatar.UpdateNewRace(); GO.transform.parent = this.gameObject.transform; GO.transform.localPosition = Vector3.zero; GO.transform.localRotation = Quaternion.identity; }
public GameObject GenerateUMA(int sex, Vector3 position) { GameObject newGO = new GameObject("Generated Character"); newGO.transform.parent = transform; newGO.transform.position = position; newGO.transform.rotation = zeroPoint != null ? zeroPoint.rotation : transform.rotation; UMADynamicAvatar umaDynamicAvatar = newGO.AddComponent <UMADynamicAvatar>(); umaDynamicAvatar.Initialize(); umaData = umaDynamicAvatar.umaData; umaData.CharacterCreated = new UMADataEvent(CharacterCreated); umaData.CharacterDestroyed = new UMADataEvent(CharacterDestroyed); umaData.CharacterUpdated = new UMADataEvent(CharacterUpdated); umaDynamicAvatar.umaGenerator = generator; umaData.umaGenerator = generator; var umaRecipe = umaDynamicAvatar.umaData.umaRecipe; UMACrowdRandomSet.CrowdRaceData race = null; if (randomPool != null && randomPool.Length > 0) { int randomResult = Random.Range(0, randomPool.Length); race = randomPool[randomResult].data; umaRecipe.SetRace(umaContext.GetRace(race.raceID)); } else { if (sex == 0) { umaRecipe.SetRace(umaContext.GetRace("HumanMaleDCS")); } else { umaRecipe.SetRace(umaContext.GetRace("HumanFemaleDCS")); } } SetUMAData(); if (race != null && race.slotElements.Length > 0) { DefineSlots(race); } else { DefineSlots(); } AddAdditionalSlots(); GenerateUMAShapes(); if (animationController != null) { umaDynamicAvatar.animationController = animationController; } umaDynamicAvatar.Show(); return(newGO); }
void Update() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if(Input.GetMouseButtonDown(1)){ if (Physics.Raycast(ray, out hit, 100)){ UMAData tempUMA = hit.collider.GetComponent("UMAData") as UMAData; umaDynamicAvatar = tempUMA.gameObject.GetComponent("UMADynamicAvatar") as UMADynamicAvatar; if(tempUMA){ //Clear saved data of old UMA if(umaDynamicAvatar){ umaDynamicAvatar.streamedUMA = null; } umaData = tempUMA; if(cameraTrack){ cameraTrack.target = umaData.transform; } umaDna = umaData.umaRecipe.umaDna[typeof(UMADnaHumanoid)] as UMADnaHumanoid; ReceiveValues(); //Save functionality umaDynamicAvatar.SaveToMemoryStream(); } } } if(umaData){ TransferValues(); for(int i = 0; i < sliderControlList.Length; i++){ if(sliderControlList[i].pressed == true){ UpdateUMAShape(); } } } //Load functionality if( Input.GetKeyDown(KeyCode.Z) ){ if(umaData && umaDynamicAvatar){ //SPOT umaDynamicAvatar.LoadFromMemoryStream(); umaData.isShapeDirty = true; umaData.Dirty(); umaDna = umaData.umaRecipe.umaDna[typeof(UMADnaHumanoid)] as UMADnaHumanoid; ReceiveValues(); //SPOT umaDynamicAvatar.SaveToMemoryStream(); } } }
/// <summary> /// Calculates the required poses necessary for an UMABonePose asset to render the Avatar in its current post DNA state, /// adds these to the selected converters 'Starting Pose' asset- creating one if necessary and resets current Dna values to 0. /// </summary> public bool CreateBonePosesFromCurrentDna(string createdAssetName = "") { if (activeUMA == null || selectedConverter == null) { Debug.LogWarning("activeUMA == null || selectedConverter == null"); return(false); } bonePoseSaveName = createdAssetName; // Build a temporary version of the Avatar with no DNA to get original state UMADnaBase[] activeDNA = activeUMA.umaData.umaRecipe.GetAllDna(); SlotData[] activeSlots = activeUMA.umaData.umaRecipe.GetAllSlots(); int slotIndex; tempAvatarPreDNA = new GameObject("Temp Raw Avatar"); tempAvatarPreDNA.transform.parent = activeUMA.transform.parent; tempAvatarPreDNA.transform.localPosition = Vector3.zero; tempAvatarPreDNA.transform.localRotation = activeUMA.transform.localRotation; UMADynamicAvatar tempAvatar = tempAvatarPreDNA.AddComponent <UMADynamicAvatar>(); tempAvatar.umaGenerator = activeUMA.umaGenerator; tempAvatar.Initialize(); tempAvatar.umaData.umaRecipe = new UMAData.UMARecipe(); tempAvatar.umaData.umaRecipe.raceData = activeUMA.umaData.umaRecipe.raceData; slotIndex = 0; foreach (SlotData slotEntry in activeSlots) { if ((slotEntry == null) || slotEntry.dontSerialize) { continue; } tempAvatar.umaData.umaRecipe.SetSlot(slotIndex++, slotEntry); } tempAvatar.Show(); tempAvatarPostDNA = new GameObject("Temp DNA Avatar"); tempAvatarPostDNA.transform.parent = activeUMA.transform.parent; tempAvatarPostDNA.transform.localPosition = Vector3.zero; tempAvatarPostDNA.transform.localRotation = activeUMA.transform.localRotation; UMADynamicAvatar tempAvatar2 = tempAvatarPostDNA.AddComponent <UMADynamicAvatar>(); tempAvatar2.umaGenerator = activeUMA.umaGenerator; tempAvatar2.Initialize(); tempAvatar2.umaData.umaRecipe = new UMAData.UMARecipe(); tempAvatar2.umaData.umaRecipe.raceData = activeUMA.umaData.umaRecipe.raceData; tempAvatar2.umaData.umaRecipe.slotDataList = activeUMA.umaData.umaRecipe.slotDataList; slotIndex = 0; foreach (SlotData slotEntry in activeSlots) { if ((slotEntry == null) || slotEntry.dontSerialize) { continue; } tempAvatar2.umaData.umaRecipe.SetSlot(slotIndex++, slotEntry); } foreach (UMADnaBase dnaEntry in activeDNA) { tempAvatar2.umaData.umaRecipe.AddDna(dnaEntry); } tempAvatar2.umaData.OnCharacterCreated += CreateBonePoseCallback; tempAvatar2.Show(); return(true); }
// An avatar has been selected, setup the camera, sliders, retarget the camera, and adjust the viewport // to account for the DNA slider scroll panel public void AvatarSetup() { umaDynamicAvatar = umaData.gameObject.GetComponent<UMADynamicAvatar>(); if(cameraTrack){ cameraTrack.target = umaData.umaRoot.transform; } umaDna = umaData.GetDna<UMADnaHumanoid>(); umaTutorialDna = umaData.GetDna<UMADnaTutorial>(); SetSliders(); SetCamera(true); }
protected void SavePoseSet() { // UMA2.8+ Lots of converters can use the same DNA now //UMA2.8+ FixDNAPrefabs raceData.GetConverter(s) now returns IDNAConverter([]) IDNAConverter[] activeConverters = sourceUMA.umaRecipe.raceData.GetConverters(sourceUMA.umaRecipe.GetDna(selectedDNAHash)); //Just use the first result? folderPath = AssetDatabase.GetAssetPath(outputFolder) + "/" + activeConverters[0].name; if (!AssetDatabase.IsValidFolder(folderPath)) { string folderGUID = AssetDatabase.CreateFolder(AssetDatabase.GetAssetPath(outputFolder), activeConverters[0].name); folderPath = AssetDatabase.GUIDToAssetPath(folderGUID); } poseSaveIndex = -1; // Build a temporary version of the Avatar with no DNA to get original state SlotData[] activeSlots = sourceUMA.umaRecipe.GetAllSlots(); int slotIndex; tempAvatarPreDNA = new GameObject("Temp Raw Avatar"); tempAvatarPreDNA.transform.parent = sourceUMA.transform.parent; tempAvatarPreDNA.transform.localPosition = Vector3.zero; tempAvatarPreDNA.transform.localRotation = sourceUMA.transform.localRotation; UMADynamicAvatar tempAvatar = tempAvatarPreDNA.AddComponent <UMADynamicAvatar>(); tempAvatar.umaGenerator = sourceUMA.umaGenerator; tempAvatar.Initialize(); tempAvatar.umaData.umaRecipe = new UMAData.UMARecipe(); tempAvatar.umaData.umaRecipe.raceData = ScriptableObject.CreateInstance <RaceData>(); tempAvatar.umaData.umaRecipe.raceData.raceName = "Temp Raw Race"; tempAvatar.umaData.umaRecipe.raceData.TPose = sourceUMA.umaRecipe.raceData.TPose; tempAvatar.umaData.umaRecipe.raceData.umaTarget = sourceUMA.umaRecipe.raceData.umaTarget; slotIndex = 0; foreach (SlotData slotEntry in activeSlots) { if ((slotEntry == null) || slotEntry.dontSerialize) { continue; } tempAvatar.umaData.umaRecipe.SetSlot(slotIndex++, slotEntry); } tempAvatar.Show(); tempAvatarPostDNA = new GameObject("Temp DNA Avatar"); tempAvatarPostDNA.transform.parent = sourceUMA.transform.parent; tempAvatarPostDNA.transform.localPosition = Vector3.zero; tempAvatarPostDNA.transform.localRotation = sourceUMA.transform.localRotation; UMADynamicAvatar tempAvatar2 = tempAvatarPostDNA.AddComponent <UMADynamicAvatar>(); tempAvatar2.umaGenerator = sourceUMA.umaGenerator; tempAvatar2.Initialize(); tempAvatar2.umaData.umaRecipe = new UMAData.UMARecipe(); tempAvatar2.umaData.umaRecipe.raceData = ScriptableObject.CreateInstance <RaceData>(); tempAvatar2.umaData.umaRecipe.raceData.raceName = "Temp DNA Race"; tempAvatar2.umaData.umaRecipe.raceData.TPose = sourceUMA.umaRecipe.raceData.TPose; tempAvatar2.umaData.umaRecipe.raceData.umaTarget = sourceUMA.umaRecipe.raceData.umaTarget; //tempAvatar2.umaData.umaRecipe.raceData.dnaConverterList = new DnaConverterBehaviour[1]; //tempAvatar2.umaData.umaRecipe.raceData.dnaConverterList[0] = activeConverter; tempAvatar2.umaData.umaRecipe.raceData.dnaConverterList = activeConverters; tempAvatar2.umaData.umaRecipe.raceData.UpdateDictionary(); slotIndex = 0; foreach (SlotData slotEntry in activeSlots) { if ((slotEntry == null) || slotEntry.dontSerialize) { continue; } tempAvatar2.umaData.umaRecipe.SetSlot(slotIndex++, slotEntry); } tempAvatar2.umaData.OnCharacterUpdated += CreateBonePoseCallback; tempAvatar2.Show(); }
public GameObject GenerateOneCharacter() { if ((recipeMixers == null) || (recipeMixers.Length == 0)) { return(null); } Vector3 umaPos = new Vector3((spawnX - crowdSize.x / 2f) * space, 0f, (spawnY - crowdSize.y / 2f) * space); if (spawnY < crowdSize.y) { spawnX++; if (spawnX >= crowdSize.x) { spawnX = 0; spawnY++; } } else { if (hideWhileGenerating) { UMAData[] generatedCrowd = GetComponentsInChildren <UMAData>(); foreach (UMAData generatedData in generatedCrowd) { if (generatedData.animator != null) { generatedData.animator.enabled = true; } Renderer[] renderers = generatedData.GetRenderers(); for (int i = 0; i < renderers.Length; i++) { renderers[i].enabled = true; } } } spawnX = 0; spawnY = 0; generating = false; return(null); } GameObject newGO = new GameObject("Generated Character"); newGO.transform.parent = transform; newGO.transform.localPosition = umaPos; newGO.transform.localRotation = Quaternion.identity; UMADynamicAvatar umaAvatar = newGO.AddComponent <UMADynamicAvatar>(); umaAvatar.context = context; umaAvatar.umaGenerator = generator; umaAvatar.Initialize(); UMAData umaData = umaAvatar.umaData; umaData.atlasResolutionScale = atlasScale; umaData.CharacterCreated = new UMADataEvent(CharacterCreated); umaData.OnCharacterCreated += CharacterCreatedCallback; umaData.CharacterDestroyed = new UMADataEvent(CharacterDestroyed); umaData.CharacterUpdated = new UMADataEvent(CharacterUpdated); RandomizeRecipe(umaData); RandomizeDNA(umaData); if (animationController != null) { umaAvatar.animationController = animationController; } umaAvatar.Show(); return(newGO); }
void Update() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if(Input.GetMouseButtonDown(1)){ if (Physics.Raycast(ray, out hit, 100)){ UMAData tempUMA = hit.collider.transform.parent.parent.GetComponent<UMAData>(); umaDynamicAvatar = tempUMA.gameObject.GetComponent<UMADynamicAvatar>(); if(tempUMA){ umaData = tempUMA; if(cameraTrack){ cameraTrack.target = umaData.umaRoot.transform; } umaDna = umaData.umaRecipe.umaDna[typeof(UMADnaHumanoid)] as UMADnaHumanoid; ReceiveValues(); } } } if(umaData){ TransferValues(); for(int i = 0; i < sliderControlList.Length; i++){ if(sliderControlList[i].pressed == true){ UpdateUMAShape(); } } } }
void GenerateUMA() { // Create a new game object and add UMA components to it GameObject GO = new GameObject("MyUMA"); umaDynamicAvatar = GO.AddComponent<UMADynamicAvatar>(); // Initialise Avatar and grab a reference to it's data component umaDynamicAvatar.Initialize(); umaData = umaDynamicAvatar.umaData; //practical guide to uma part 15 uma events https://youtu.be/_k-SZRCvgIk?t=8m20s umaData.OnCharacterCreated += CharacterCreatedCallback; // Attach our generator umaDynamicAvatar.umaGenerator = generator; umaData.umaGenerator = generator; // Set up slot Array umaData.umaRecipe.slotDataList = new SlotData[numberOfSlots]; // Set up our Morph reference umaDna = new UMADnaHumanoid(); umaTutorialDNA = new UMADnaTutorial(); umaData.umaRecipe.AddDna(umaDna); umaData.umaRecipe.AddDna(umaTutorialDNA); // Grab a reference to our recipe // var umaRecipe = umaDynamicAvatar.umaData.umaRecipe; //moved to subroutine MakeMale // >>> This is where the fun will happen according to Secret Anorak <<<< CreateFemale(); // dynamic animation controller umaDynamicAvatar.animationController = animController; // Generate Our UMA umaDynamicAvatar.UpdateNewRace(); }
void GenerateUMA() { // Create a new game object and add UMA components to it GameObject GO = new GameObject("MyUMA"); // parent the new uma into the host game object GO.transform.parent = this.gameObject.transform; GO.transform.localPosition = Vector3.zero; GO.transform.localRotation = Quaternion.identity; GO.AddComponent(typeof(NavMeshAgent)); GO.AddComponent(typeof(CapsuleCollider)); var goCol = GO.GetComponent<CapsuleCollider>(); goCol.center = new Vector3(0f, 0.78f, 0f); goCol.height = 1.7f; goCol.radius = 0.33f; umaDynamicAvatar = GO.AddComponent<UMADynamicAvatar>(); // Initialise Avatar and grab a reference to it's data component umaDynamicAvatar.Initialize(); umaData = umaDynamicAvatar.umaData; //practical guide to uma part 15 uma events https://youtu.be/_k-SZRCvgIk?t=8m20s umaData.OnCharacterCreated += CharacterCreatedCallback; // Attach our generator umaDynamicAvatar.umaGenerator = generator; umaData.umaGenerator = generator; // Set up slot Array umaData.umaRecipe.slotDataList = new SlotData[numberOfSlots]; // Set up our Morph reference umaDna = new UMADnaHumanoid(); umaTutorialDNA = new UMADnaTutorial(); umaData.umaRecipe.AddDna(umaDna); umaData.umaRecipe.AddDna(umaTutorialDNA); // Grab a reference to our recipe // var umaRecipe = umaDynamicAvatar.umaData.umaRecipe; //moved to subroutine MakeMale // >>> This is whee the fun will happen according to Secret Anorak <<<< CreateMale(); // dynamic animation controller umaDynamicAvatar.animationController = animController; // Generate Our UMA umaDynamicAvatar.UpdateNewRace(); }
GameObject GenerateUMA(string name) { // Create a new game object and add UMA components to it GameObject GO = new GameObject(name); GO.transform.position = this.transform.position; //parentAtPosition(GO); umaDynamicAvatar = GO.AddComponent<UMADynamicAvatar>(); umaDynamicAvatar.animationController = animationController; GO.AddComponent<RagdollCreatorTest>(); if (name.Contains ("Zombie")) { ZombieBehavior zbh = GO.AddComponent<ZombieBehavior> (); zbh.speedMultiplier = Random.Range (0.5f, 2.5f); GO.tag = "Zombie"; GameObject[] zombies = GameObject.FindGameObjectsWithTag("Zombie"); GO.name = "Zombie" + zombies.Length; } else { HumanBehavior hb = GO.AddComponent<HumanBehavior> (); hb.zombieAnimationController = secondaryAnimationController; GO.tag = "Human"; // GameObject[] humans = GameObject.FindGameObjectsWithTag("Human"); //GO.name = "Human" + humans.Length; } GO.AddComponent<NavMeshAgent> (); GO.AddComponent<HealthComponent> (); // Initialize Avatar and grab a reference to its data component umaDynamicAvatar.Initialize(); umaData = umaDynamicAvatar.umaData; // Attach our generator umaDynamicAvatar.umaGenerator = generator; umaData.umaGenerator = generator; // Set up slot Array umaData.umaRecipe.slotDataList = new SlotData[numberOfSlots]; // Set up our Morph references umaDna = new UMADnaHumanoid(); umaTutorialDNA = new UMADnaTutorial(); umaData.umaRecipe.AddDna(umaDna); umaData.umaRecipe.AddDna(umaTutorialDNA); if (name.Contains ("Female")) { CreateFemale (); } else { CreateMale (); } // Generate our UMA setupDna (umaDna); umaDynamicAvatar.UpdateNewRace(); if (name.Contains("Human")) { if (name.Contains("Female")) { GO.name = createName("Female"); } else { GO.name = createName("Male"); } } return GO; }
/// <summary> /// Create a new UMA from a given HumanoidStructure. /// </summary> /// <returns> /// Returns a reference to the created GameObject containing the generated UMA. /// </returns> /// <param name='name'> /// The name given to the GameObject in the heirarchy. /// </param> /// <param name='position'> /// The Vector3 position to give the new UMA. /// </param> /// <param name='layer'> /// The layer to put the UMA in, or 0 for the default layer /// </param> /// <param name='human'> /// The UMAElements.HumanoidStructure to build from. /// </param> /// <param name='useRigidBody'> /// Whether to keep a RigidBody on the new UMA. /// </param> /// <param name='useCharController'> /// Whether to add a CharacterController to the new UMA. /// </param> /// <param name='animationController'> /// If null, will keep the original Locomotion script, or use the given RuntimeAnimationController. /// </param> public static GameObject Create(HumanoidStructure human, string name, RuntimeAnimatorController animationController, Vector3 position = default(Vector3), int layer = 0, bool useRigidBody = true, bool useCharController = true) { // are we initialized? if (!_initialized) { Debug.LogError("UMAElements.HumanoidBuilder.Create: Attempted use before initialization. Must call HumanoidBuilder.Initialize(scale) first."); return(null); } // create a new UMARecipe GameObject thisUMA = new GameObject(name); UMADynamicAvatar dynamicAvatar = thisUMA.AddComponent <UMADynamicAvatar>(); dynamicAvatar.Initialize(); UMAData thisUMAData = dynamicAvatar.umaData; dynamicAvatar.umaGenerator = _generator; thisUMAData.umaGenerator = _generator; var umaRecipe = dynamicAvatar.umaData.umaRecipe; thisUMAData.OnCharacterCreated += UMAFinished; // race and gender bool found = false; if (human.gender == 'M') { umaRecipe.SetRace(_raceLibrary.GetRace("HumanMale")); found = true; } else if (human.gender == 'F') { umaRecipe.SetRace(_raceLibrary.GetRace("HumanFemale")); found = true; } if (!found) { Debug.LogError("UMAElements.HumanoidBuilder.Create: Incorrect gender given as '" + human.gender + "'. UMA could not be built."); return(null); } // do the build (this is the same as update) thisUMAData.atlasResolutionScale = _atlasScale; BuildUMAShape(thisUMAData, human, true); BuildUMASlots(thisUMAData, human, true); // remove the rigidbody (if required) if (useRigidBody) { thisUMA.AddComponent <Rigidbody>(); } // add a character controller (if required) if (useCharController) { CapsuleCollider chc = thisUMA.AddComponent <CapsuleCollider>(); chc.radius = 0.0015f * human.height; chc.height = (human.height / 100.0f); chc.center = new Vector3(0, chc.height / 2.0f, 0); } // add the correct animator (if required) if (animationController != null) { dynamicAvatar.animationController = animationController; } // put the uma in the correct position thisUMA.transform.position = position; // ensure that all elements of the uma are set to the "Entities" layer thisUMA.layer = layer; foreach (Transform t in thisUMA.GetComponentsInChildren <Transform>()) { t.gameObject.layer = layer; } dynamicAvatar.UpdateNewRace(); Humanoid tmp = new Humanoid(); tmp.name = name; tmp.human = human; _charList.Add(tmp); // finally return this UMA's game object return(thisUMA); }
private GameObject MakeEnemy(UMADynamicAvatar avatar) { GameObject realPlayerObject = avatar.gameObject.transform.GetChild(0).transform.GetChild(0).gameObject; if(realPlayerObject.GetComponent<Locomotion> () != null) realPlayerObject.GetComponent<Locomotion> ().enabled = false; //if (realPlayerObject.GetComponent<CapsuleCollider> () != null) realPlayerObject.GetComponent<CapsuleCollider> ().enabled = false; if (realPlayerObject.rigidbody != null) realPlayerObject.rigidbody.constraints = RigidbodyConstraints.FreezeAll; return realPlayerObject; }
void GenerateUMA() { //Create a new game object and add UMA components to it GameObject GO = new GameObject ("MyUMA"); umaDynamicAvatar = GO.AddComponent<UMADynamicAvatar>(); //Initialise Avatar and grab a refrence to its data component umaDynamicAvatar.Initialize(); umaData = umaDynamicAvatar.umaData; //Attach our generator umaDynamicAvatar.umaGenerator = generator; umaData.umaGenerator = generator; //Setup slot array umaData.umaRecipe.slotDataList = new SlotData[numberOfSlots]; //Set up our morph refrence umaDNA = new UMADnaHumanoid(); umaTutorialDNA = new UMADnaTutorial(); umaData.umaRecipe.AddDna (umaDNA); umaData.umaRecipe.AddDna (umaTutorialDNA); //----------UMA Generation Section----------------- CreateMale(); umaDynamicAvatar.animationController = animController; //Generate our UMA umaDynamicAvatar.UpdateNewRace(); GO.transform.parent = this.gameObject.transform; GO.transform.localPosition = Vector3.zero; GO.transform.localRotation = Quaternion.identity; }
void GenerateUMA() { //UMA naming // Check a list of UMA objects. int umaCount = GameObject.FindGameObjectsWithTag("UMA").Length; UMAName = "UMA_" + umaCount.ToString(); // Create a new game object and add UMA components to it GameObject GO = new GameObject("myUMA"); GO.tag = "UMA"; umaDynamicAvatar = GO.AddComponent<UMADynamicAvatar>(); // Initialise Avatar and grab a reference to it's data component umaDynamicAvatar.Initialize(); umaData = umaDynamicAvatar.umaData; //practical guide to uma part 15 uma events https://youtu.be/_k-SZRCvgIk?t=8m20s umaData.OnCharacterCreated += CharacterCreatedCallback; // Attach our generator umaDynamicAvatar.umaGenerator = generator; umaData.umaGenerator = generator; // Set up slot Array umaData.umaRecipe.slotDataList = new SlotData[numberOfSlots]; // Set up our Morph reference umaDna = new UMADnaHumanoid(); umaTutorialDNA = new UMADnaTutorial(); umaData.umaRecipe.AddDna(umaDna); umaData.umaRecipe.AddDna(umaTutorialDNA); // Grab a reference to our recipe // var umaRecipe = umaDynamicAvatar.umaData.umaRecipe; //moved to subroutine MakeMale // >>> This is whee the fun will happen according to Secret Anorak <<<< CreateMale(); // dynamic animation controller umaDynamicAvatar.animationController = animController; // Generate Our UMA umaDynamicAvatar.UpdateNewRace(); // parent the new uma into the host game object GO.transform.parent = this.gameObject.transform; GO.transform.localPosition = Vector3.zero; GO.transform.localRotation = Quaternion.identity; }
public void RandomizeAll() { if (generateUMA || generateLotsUMA) { Debug.LogWarning("Can't randomize while spawning."); return; } int childCount = gameObject.transform.childCount; for (int i = 0; i < childCount; i++) { Transform child = gameObject.transform.GetChild(i); UMADynamicAvatar umaDynamicAvatar = child.gameObject.GetComponent <UMADynamicAvatar>(); if (umaDynamicAvatar == null) { Debug.Log("Couldn't find dynamic avatar on child: " + child.gameObject.name); continue; } umaData = umaDynamicAvatar.umaData; var umaRecipe = umaDynamicAvatar.umaData.umaRecipe; UMACrowdRandomSet.CrowdRaceData race = null; if (randomPool != null && randomPool.Length > 0) { int randomResult = Random.Range(0, randomPool.Length); race = randomPool[randomResult].data; umaRecipe.SetRace(umaContext.GetRace(race.raceID)); } else { if (Random.value < 0.5f) { umaRecipe.SetRace(umaContext.GetRace("HumanMaleDCS")); } else { umaRecipe.SetRace(umaContext.GetRace("HumanFemaleDCS")); } } // SetUMAData(); if (race != null && race.slotElements.Length > 0) { DefineSlots(race); } else { DefineSlots(); } AddAdditionalSlots(); GenerateUMAShapes(); if (animationController != null) { umaDynamicAvatar.animationController = animationController; } umaDynamicAvatar.Show(); } }
public static string Save(UMADynamicAvatar avatarToSave) { return LitJson.JsonMapper.ToJson(UMAPackedRecipeBase.PackRecipe(avatarToSave.umaData)); }