Add rank, friends, fishing, and camp treasure with T2 studio models and skill presentation.
Co-authored-by: Cursor <cursoragent@cursor.com>
@@ -0,0 +1,69 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using HotUpdate.Gameplay;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEditor.SceneManagement;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using Object=UnityEngine.Object;
|
||||
|
||||
public static class BuildBattleSkills
|
||||
{
|
||||
public const string Bank="Assets/Bundles/Combat/BattleSkillPresentation.prefab";
|
||||
const string Arena="Assets/Bundles/Scenes/Prototype/PrototypeArena.prefab";
|
||||
static readonly string[] Pets={"RockBall","FireCat","BudBud","SparkBird","BubbleTurtle","RockRhino","FlameLion","VineSprite","ThunderLeopard","TideWhale"};
|
||||
static readonly string[] Enemies={"Hornlet","Dashlet","Shellhorn","HornCaptain","GreatHorn"};
|
||||
static readonly string[] Effects={"FireCharge","Fireball","FireHit","RockHit","Shield"};
|
||||
static readonly string[] Sounds={"FireCharge","FireLaunch","FireHit","RockHit","Shield","Heal","Slow","Lightning","EnemyHit"};
|
||||
public static string Build()
|
||||
{
|
||||
if(EditorApplication.isPlaying)throw new Exception("Author in Edit Mode");
|
||||
var previous=SceneManager.GetActiveScene();var scene=EditorSceneManager.NewScene(NewSceneSetup.EmptyScene,NewSceneMode.Additive);
|
||||
try
|
||||
{
|
||||
var plan=JObject.Parse(File.ReadAllText("../Config/Combat/partner_presentations_v1.json"));
|
||||
SceneManager.SetActiveScene(scene);var root=new GameObject("BattleSkillPresentation");var player=root.AddComponent<BattleSkillPresentation>();var so=new SerializedObject(player);var effects=so.FindProperty("_effects");effects.arraySize=15;
|
||||
var ground=so.FindProperty("_groundEffects");ground.arraySize=15;var lifetimes=so.FindProperty("_effectLifetimes");lifetimes.arraySize=15;
|
||||
for(int i=0;i<15;i++)
|
||||
{
|
||||
JToken definition=i>=5?plan["effects"][i-5]:null;var list=effects.GetArrayElementAtIndex(i).FindPropertyRelative("instances");list.arraySize=i<5?(i==1?12:6):(int)definition["poolSize"];
|
||||
var path=i<5?"Assets/Bundles/Combat/SkillSlice/Vfx_Skill_"+Effects[i]+".prefab":(string)definition["path"];var prefab=AssetDatabase.LoadAssetAtPath<GameObject>(path);if(prefab==null)throw new Exception("Missing "+path);
|
||||
ground.GetArrayElementAtIndex(i).boolValue=definition!=null&&(bool)definition["ground"];lifetimes.GetArrayElementAtIndex(i).floatValue=definition==null?.65f:(float)definition["lifetime"];
|
||||
for(int n=0;n<list.arraySize;n++){var go=(GameObject)PrefabUtility.InstantiatePrefab(prefab,root.transform);list.GetArrayElementAtIndex(n).objectReferenceValue=go.GetComponent<ParticleSystem>();}
|
||||
}
|
||||
var profiles=so.FindProperty("_profiles");profiles.arraySize=10;
|
||||
for(int i=0;i<10;i++)foreach(var property in ((JObject)plan["profiles"][i]).Properties())if(property.Name!="actor")profiles.GetArrayElementAtIndex(i).FindPropertyRelative(property.Name).intValue=(int)property.Value;
|
||||
var clips=so.FindProperty("_clips");clips.arraySize=Sounds.Length;
|
||||
for(int i=0;i<Sounds.Length;i++)
|
||||
{
|
||||
string path="Assets/Bundles/Sound/SFX/BattleSkills/Sfx_"+Sounds[i]+".wav";AssetDatabase.ImportAsset(path,ImportAssetOptions.ForceUpdate);var importer=(AudioImporter)AssetImporter.GetAtPath(path);if(importer==null)throw new Exception("Missing "+path);var sample=importer.defaultSampleSettings;sample.compressionFormat=AudioCompressionFormat.PCM;sample.loadType=AudioClipLoadType.DecompressOnLoad;sample.sampleRateSetting=AudioSampleRateSetting.PreserveSampleRate;importer.defaultSampleSettings=sample;importer.forceToMono=false;importer.SaveAndReimport();clips.GetArrayElementAtIndex(i).objectReferenceValue=AssetDatabase.LoadAssetAtPath<AudioClip>(path);
|
||||
}
|
||||
var voices=so.FindProperty("_voices");voices.arraySize=8;
|
||||
for(int i=0;i<8;i++){var go=new GameObject("Voice"+i);go.transform.SetParent(root.transform,false);var voice=go.AddComponent<AudioSource>();voice.playOnAwake=false;voice.spatialBlend=0;voice.volume=.3f/8;voices.GetArrayElementAtIndex(i).objectReferenceValue=voice;}
|
||||
for(int team=0;team<2;team++)
|
||||
{
|
||||
var actors=team==0?Pets:Enemies;var impacts=so.FindProperty(team==0?"_petImpacts":"_enemyImpacts");impacts.arraySize=actors.Length;
|
||||
for(int i=0;i<actors.Length;i++)
|
||||
{
|
||||
string path="../Config/Art/"+(team==0&&i!=0?"Companions":"EnemyCharacters")+"/"+actors[i]+".json";
|
||||
var recipe=JObject.Parse(File.ReadAllText(path));impacts.GetArrayElementAtIndex(i).floatValue=(float)recipe["attackImpact"];
|
||||
}
|
||||
}
|
||||
so.ApplyModifiedPropertiesWithoutUndo();foreach(var t in root.GetComponentsInChildren<Transform>(true))t.gameObject.layer=30;PrefabUtility.SaveAsPrefabAsset(root,Bank);Object.DestroyImmediate(root);
|
||||
}
|
||||
finally{SceneManager.SetActiveScene(previous);EditorSceneManager.CloseScene(scene,true);}
|
||||
var arena=PrefabUtility.LoadPrefabContents(Arena);
|
||||
try
|
||||
{
|
||||
foreach(string group in new[]{"Heroes","Enemies"})foreach(Transform actor in arena.transform.Find(group))
|
||||
{
|
||||
var muzzle=actor.Find("SkillMuzzle");if(muzzle==null){muzzle=new GameObject("SkillMuzzle").transform;muzzle.SetParent(actor,false);muzzle.localPosition=new Vector3(0,group=="Heroes"?.85f:.8f,-.48f);muzzle.gameObject.layer=30;}
|
||||
}
|
||||
var old=arena.GetComponentInChildren<BattleSkillPresentation>(true);if(old!=null)Object.DestroyImmediate(old.gameObject);PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(Bank),arena.transform);PrefabUtility.SaveAsPrefabAsset(arena,Arena);
|
||||
}
|
||||
finally{PrefabUtility.UnloadPrefabContents(arena);}
|
||||
return "Saved bounded battle skill bank, authored animation phases for 10 pets / 5 enemies, attached to existing arena";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using AIGame.EditorTools;
|
||||
using UnityEditor;
|
||||
|
||||
public static class BuildFishing
|
||||
{
|
||||
public static string Build()
|
||||
{
|
||||
if (EditorApplication.isPlaying) throw new Exception("Build the fishing page in Edit Mode");
|
||||
string repo = Directory.GetParent(UnityEngine.Application.dataPath).Parent.FullName;
|
||||
if (string.IsNullOrEmpty(JsonUIPrefabBuilder.BuildFromJsonFile(Path.Combine(repo, "Doc/UIPrefabCreater/UI_PrototypeFishing.json")))) throw new Exception("Fishing prefab failed");
|
||||
if (string.IsNullOrEmpty(JsonUIPrefabBuilder.BuildFromJsonFile(Path.Combine(repo, "Doc/UIPrefabCreater/UI_PrototypeChallenges.json")))) throw new Exception("Challenge entry failed");
|
||||
SetupUiBundleCollector.Setup();
|
||||
AssetDatabase.SaveAssets();
|
||||
return "Built the fishing page";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using AIGame.EditorTools;
|
||||
using UnityEditor;
|
||||
|
||||
public static class BuildFriends
|
||||
{
|
||||
public static string Build()
|
||||
{
|
||||
if (EditorApplication.isPlaying) throw new Exception("Build the friends page in Edit Mode");
|
||||
string repo = Directory.GetParent(UnityEngine.Application.dataPath).Parent.FullName;
|
||||
if (string.IsNullOrEmpty(JsonUIPrefabBuilder.BuildFromJsonFile(Path.Combine(repo, "Doc/UIPrefabCreater/UI_PrototypeFriends.json")))) throw new Exception("Friends prefab failed");
|
||||
if (string.IsNullOrEmpty(JsonUIPrefabBuilder.BuildFromJsonFile(Path.Combine(repo, "Doc/UIPrefabCreater/UI_MainHUD.json")))) throw new Exception("Home button failed");
|
||||
SetupUiBundleCollector.Setup();
|
||||
AssetDatabase.SaveAssets();
|
||||
return "Built the friends page";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEditor.SceneManagement;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using Object=UnityEngine.Object;
|
||||
|
||||
/// <summary>Ten persistent partner silhouettes, authored mesh particles and bounded lightning ribbons.</summary>
|
||||
public static class BuildPartnerSkillFx
|
||||
{
|
||||
public const string Folder="Assets/Bundles/Combat/Partners";
|
||||
static readonly Color[] Colors={new Color(1,.72f,.25f,.6f),new Color(1,.3f,.035f),new Color(.8f,1,.4f),new Color(.4f,.85f,1),new Color(.3f,.9f,1,.45f),new Color(.85f,.65f,.3f),new Color(1,.38f,.02f),new Color(.3f,.9f,.45f),new Color(.75f,.55f,1),new Color(.2f,.8f,1,.25f)};
|
||||
static Material Glow;
|
||||
static void Material(){string path=Folder+"/PartnerSkillGlow.mat";Glow=AssetDatabase.LoadAssetAtPath<Material>(path);if(Glow==null){Glow=new Material(Shader.Find("AIGame/EnemyCombatParticle"));AssetDatabase.CreateAsset(Glow,path);}Glow.mainTexture=null;EditorUtility.SetDirty(Glow);}
|
||||
static Mesh Ring=>AssetDatabase.LoadAssetAtPath<Mesh>("Assets/Bundles/Effects/EnemyCombat/CombatRing.asset");
|
||||
static void Folders(string path){if(AssetDatabase.IsValidFolder(path))return;string parent=Path.GetDirectoryName(path).Replace('\\','/');Folders(parent);AssetDatabase.CreateFolder(parent,Path.GetFileName(path));}
|
||||
static Mesh SaveMesh(string name,List<Vector3> vertices,List<int> triangles)
|
||||
{
|
||||
string path=Folder+"/"+name+".asset";var mesh=AssetDatabase.LoadAssetAtPath<Mesh>(path);if(mesh==null){mesh=new Mesh();AssetDatabase.CreateAsset(mesh,path);}else mesh.Clear();
|
||||
mesh.name=name;mesh.SetVertices(vertices);mesh.SetTriangles(triangles,0);mesh.uv=vertices.Select(v=>new Vector2(.5f+v.x*.4f,.5f+v.y*.4f)).ToArray();mesh.RecalculateBounds();mesh.RecalculateNormals();EditorUtility.SetDirty(mesh);return mesh;
|
||||
}
|
||||
static Mesh Gem()=>SaveMesh("SkillStone",new List<Vector3>{Vector3.up*.5f,Vector3.down*.5f,Vector3.left*.35f,Vector3.right*.35f,Vector3.forward*.35f,Vector3.back*.35f},new List<int>{0,2,4,0,4,3,0,3,5,0,5,2,1,4,2,1,3,4,1,5,3,1,2,5});
|
||||
static Mesh Leaf()=>SaveMesh("SkillLeaf",new List<Vector3>{new Vector3(0,.6f,0),new Vector3(.32f,0,.06f),new Vector3(0,-.6f,0),new Vector3(-.32f,0,-.06f)},new List<int>{0,1,2,0,2,3});
|
||||
static Mesh Cross()=>SaveMesh("SkillHealCross",new List<Vector3>{new Vector3(-.13f,-.5f,0),new Vector3(.13f,-.5f,0),new Vector3(-.13f,.5f,0),new Vector3(.13f,.5f,0),new Vector3(-.5f,-.13f,0),new Vector3(.5f,-.13f,0),new Vector3(-.5f,.13f,0),new Vector3(.5f,.13f,0)},new List<int>{0,1,2,2,1,3,4,5,6,6,5,7});
|
||||
static Mesh Sphere(string name,bool dome)
|
||||
{
|
||||
var v=new List<Vector3>();var tri=new List<int>();const int rows=6,cols=12;
|
||||
for(int y=0;y<=rows;y++)for(int x=0;x<=cols;x++){float a=x/(float)cols*Mathf.PI*2,b=y/(float)rows*Mathf.PI*(dome?.5f:1);v.Add(new Vector3(Mathf.Cos(a)*Mathf.Sin(b),Mathf.Cos(b),Mathf.Sin(a)*Mathf.Sin(b))*.5f);}
|
||||
for(int y=0;y<rows;y++)for(int x=0;x<cols;x++){int i=y*(cols+1)+x;tri.AddRange(new[]{i,i+1,i+cols+1,i+1,i+cols+2,i+cols+1});}return SaveMesh(name,v,tri);
|
||||
}
|
||||
static Mesh Helix()
|
||||
{
|
||||
var v=new List<Vector3>();var tri=new List<int>();const int count=64;
|
||||
for(int i=0;i<=count;i++){float t=i/(float)count,a=t*Mathf.PI*4;var center=new Vector3(Mathf.Cos(a)*.45f,t-.5f,Mathf.Sin(a)*.45f);v.Add(center+Vector3.up*.022f);v.Add(center-Vector3.up*.022f);if(i<count){int k=i*2;tri.AddRange(new[]{k,k+1,k+2,k+1,k+3,k+2});}}return SaveMesh("SkillVineHelix",v,tri);
|
||||
}
|
||||
static ParticleSystem Part(Transform parent,string name,Mesh mesh,Color color,int count,float life,float size,float speed=0,bool loop=false)
|
||||
{
|
||||
var go=new GameObject(name);go.layer=30;if(parent!=null)go.transform.SetParent(parent,false);var ps=go.AddComponent<ParticleSystem>();var main=ps.main;main.playOnAwake=false;main.loop=loop;main.duration=.75f;main.startLifetime=life;main.startSize=size;main.startSpeed=speed;main.startColor=color;main.maxParticles=24;main.startRotation3D=true;main.simulationSpace=ParticleSystemSimulationSpace.Local;
|
||||
var emission=ps.emission;emission.rateOverTime=loop?2:0;if(!loop)emission.SetBursts(new[]{new ParticleSystem.Burst(0,(short)count)});
|
||||
var shape=ps.shape;shape.shapeType=ParticleSystemShapeType.Sphere;shape.radius=.3f;
|
||||
var renderer=ps.GetComponent<ParticleSystemRenderer>();renderer.sharedMaterial=Glow;renderer.renderMode=ParticleSystemRenderMode.Mesh;renderer.mesh=mesh;renderer.alignment=ParticleSystemRenderSpace.Local;
|
||||
var colorLife=ps.colorOverLifetime;colorLife.enabled=true;var gradient=new Gradient();gradient.SetKeys(new[]{new GradientColorKey(Color.white,0),new GradientColorKey(color,1)},new[]{new GradientAlphaKey(.9f,0),new GradientAlphaKey(.65f,.5f),new GradientAlphaKey(0,1)});colorLife.color=gradient;
|
||||
var sizeLife=ps.sizeOverLifetime;sizeLife.enabled=true;sizeLife.size=new ParticleSystem.MinMaxCurve(1,AnimationCurve.Linear(0,.7f,1,1.15f));return ps;
|
||||
}
|
||||
static ParticleSystem Halo(Transform parent,Color color,float size,bool ground=false,bool loop=false)
|
||||
{
|
||||
var ps=Part(parent,ground?"GroundRipple":"Halo",Ring,color,1,.55f,size,0,loop);if(ground)ps.transform.localRotation=Quaternion.Euler(90,0,0);return ps;
|
||||
}
|
||||
public static string Build()
|
||||
{
|
||||
if(EditorApplication.isPlaying)throw new Exception("Author in Edit Mode");Folders(Folder);Material();var config=JObject.Parse(File.ReadAllText("../Config/Combat/partner_presentations_v1.json"));var gem=Gem();var leaf=Leaf();var cross=Cross();var bubble=Sphere("SkillBubble",false);var dome=Sphere("SkillWaterDome",true);var helix=Helix();
|
||||
var previous=SceneManager.GetActiveScene();var scene=EditorSceneManager.NewScene(NewSceneSetup.EmptyScene,NewSceneMode.Additive);
|
||||
try
|
||||
{
|
||||
SceneManager.SetActiveScene(scene);
|
||||
for(int actor=0;actor<10;actor++)
|
||||
{
|
||||
var definition=config["effects"][actor];string name=(string)definition["name"];bool loop=(bool)definition["loop"];Color color=Colors[actor];
|
||||
var root=Part(null,"Vfx_"+name,actor==2||actor==7?leaf:actor==4||actor==9?bubble:gem,color,loop?2:8,.5f,actor==4?.2f:.12f,actor==2||actor==7?.6f:.4f,loop);
|
||||
if(actor==0){Halo(root.transform,color,1.8f,false,true);var stones=Part(root.transform,"OrbitingArmor",gem,color,4,.65f,.35f,0,true);var shape=stones.shape;shape.shapeType=ParticleSystemShapeType.Circle;shape.radius=.95f;var rotation=stones.rotationOverLifetime;rotation.enabled=true;rotation.z=1.5f;}
|
||||
if(actor==1){Halo(root.transform,new Color(1,.45f,.08f,.6f),1.5f);var sparks=Part(root.transform,"EmberSpray",gem,new Color(1,.8f,.2f),12,.35f,.10f,2);var shape=sparks.shape;shape.radius=.1f;}
|
||||
if(actor==2){Halo(root.transform,new Color(.4f,1,.4f,.4f),1.65f,true);var petals=Part(root.transform,"BlossomPetals",leaf,new Color(1,.7f,.85f),12,.6f,.42f,1.1f);petals.transform.localPosition=Vector3.up*.55f;var plus=Part(root.transform,"HealingBloom",cross,new Color(.8f,1,.45f),1,.6f,.9f);plus.transform.localPosition=Vector3.up*1.35f;}
|
||||
if(actor==3||actor==8)
|
||||
{
|
||||
var line=root.gameObject.AddComponent<LineRenderer>();line.useWorldSpace=false;line.positionCount=9;line.sharedMaterial=Glow;line.widthMultiplier=actor==3?.06f:.09f;line.startColor=color;line.endColor=Color.white;line.numCapVertices=2;line.enabled=false;
|
||||
Halo(root.transform,color,actor==3?.9f:1.2f);
|
||||
if(actor==8)for(int n=0;n<3;n++){var slash=Part(root.transform,"ThunderClaw"+n,leaf,new Color(.8f,.6f,1),1,.2f,1);slash.transform.localPosition=new Vector3((n-1)*.2f,0,0);slash.transform.localRotation=Quaternion.Euler(0,0,-25);slash.transform.localScale=new Vector3(.15f,1.2f,1);}
|
||||
}
|
||||
if(actor==4){Halo(root.transform,new Color(.4f,.9f,1,.4f),1.2f);var bubbles=Part(root.transform,"FloatingBubbleCage",bubble,new Color(.5f,.9f,1,.38f),9,.65f,.55f,.65f);var shape=bubbles.shape;shape.radius=.9f;}
|
||||
if(actor==5){Halo(root.transform,new Color(1,.7f,.3f,.6f),2.5f,true);var chunks=Part(root.transform,"QuakeStones",gem,color,12,.55f,.35f,2f);var main=chunks.main;main.gravityModifier=.6f;var shape=chunks.shape;shape.shapeType=ParticleSystemShapeType.Cone;shape.angle=65;chunks.transform.localRotation=Quaternion.Euler(-90,0,0);}
|
||||
if(actor==6){var flames=Part(root.transform,"ForwardFlamePlume",leaf,new Color(1,.45f,.03f),20,.4f,.5f,6);var shape=flames.shape;shape.shapeType=ParticleSystemShapeType.Cone;shape.angle=18;shape.radius=.12f;var main=flames.main;main.startSize3D=true;main.startSizeX=.3f;main.startSizeY=.9f;main.startSizeZ=.4f;}
|
||||
if(actor==7){Halo(root.transform,new Color(.3f,1,.5f,.3f),1.8f,true);var vine=Part(root.transform,"RisingVines",helix,new Color(.3f,1,.45f,.8f),1,.65f,1.6f);vine.transform.localPosition=Vector3.up*.9f;var leaves=Part(root.transform,"GreenLeaves",leaf,new Color(.75f,1,.25f),10,.6f,.3f,.7f);leaves.transform.localPosition=Vector3.up*.6f;}
|
||||
if(actor==9){Part(root.transform,"WaterDome",dome,new Color(.2f,.85f,1,.16f),1,.65f,2.7f,0,true);Halo(root.transform,new Color(.25f,.85f,1,.25f),1.9f,false,true);var tide=Halo(root.transform,new Color(.4f,.9f,1,.25f),2.2f,true,true);tide.transform.localPosition=Vector3.down*.75f;}
|
||||
PrefabUtility.SaveAsPrefabAsset(root.gameObject,(string)definition["path"]);Object.DestroyImmediate(root.gameObject);
|
||||
}
|
||||
AssetDatabase.SaveAssets();return "Saved ten distinct partner skill prefabs and six low-poly effect meshes";
|
||||
}
|
||||
finally{SceneManager.SetActiveScene(previous);EditorSceneManager.CloseScene(scene,true);}
|
||||
}
|
||||
}
|
||||
@@ -20,16 +20,16 @@ public static class BuildPrototype
|
||||
/// <summary>Validated formal partner art by pet id; other ids keep primitive stand-ins until their art passes review.</summary>
|
||||
static readonly System.Collections.Generic.Dictionary<int, string> FormalPets = new System.Collections.Generic.Dictionary<int, string>
|
||||
{
|
||||
[0] = Animal + "RockBall/RockBall_Rigged.prefab", [1] = Animal + "FireCat/FireCat_Companion.prefab", [2] = Animal + "BudBud/BudBud_Companion.prefab",
|
||||
[3] = Animal + "SparkBird/SparkBird_Companion.prefab", [4] = Animal + "BubbleTurtle/BubbleTurtle_Companion.prefab",
|
||||
[5] = Animal + "RockRhino/RockRhino_Companion.prefab", [6] = Animal + "FlameLion/FlameLion_Companion.prefab",
|
||||
[7] = Animal + "VineSprite/VineSprite_Companion.prefab", [8] = Animal + "ThunderLeopard/ThunderLeopard_Companion.prefab", [9] = Animal + "TideWhale/TideWhale_Companion.prefab",
|
||||
[0] = Animal + "RockBallStudio/RockBallStudio_Companion.prefab", [1] = Animal + "FireCatStudio/FireCatStudio_Companion.prefab", [2] = Animal + "BudBudStudio/BudBudStudio_Companion.prefab",
|
||||
[3] = Animal + "SparkBirdStudio/SparkBirdStudio_Companion.prefab", [4] = Animal + "BubbleTurtle/BubbleTurtle_Companion.prefab",
|
||||
[5] = Animal + "RockRhinoStudio/RockRhinoStudio_Companion.prefab", [6] = Animal + "FlameLion/FlameLion_Companion.prefab",
|
||||
[7] = Animal + "VineSpriteStudio/VineSpriteStudio_Companion.prefab", [8] = Animal + "ThunderLeopardStudio/ThunderLeopardStudio_Companion.prefab", [9] = Animal + "TideWhaleStudio/TideWhaleStudio_Companion.prefab",
|
||||
};
|
||||
/// <summary>Battle height in arena units; the authored models are ~0.55m and the lanes are 3 units apart.</summary>
|
||||
public const float FormalHeight = 1.5f;
|
||||
const string Enemy = "Assets/Bundles/Characters/Enemy/";
|
||||
/// <summary>Formal enemy art by enemy type id (greenfield.json enemies 0..4), nested under every Enemies/EnemyN slot as Type{t}.</summary>
|
||||
static readonly string[] FormalEnemies = { Enemy + "Hornlet/Hornlet_Enemy.prefab", Enemy + "Dashlet/Dashlet_Enemy.prefab", Enemy + "Shellhorn/Shellhorn_Enemy.prefab", Enemy + "HornCaptain/HornCaptain_Enemy.prefab", Enemy + "GreatHorn/GreatHorn_Enemy.prefab" };
|
||||
static readonly string[] FormalEnemies = { Enemy + "HornletStudio/HornletStudio_Enemy.prefab", Enemy + "DashletStudio/DashletStudio_Enemy.prefab", Enemy + "ShellhornStudio/ShellhornStudio_Enemy.prefab", Enemy + "HornCaptainStudio/HornCaptainStudio_Enemy.prefab", Enemy + "GreatHornStudio/GreatHornStudio_Enemy.prefab" };
|
||||
/// <summary>Base enemy height in arena units; the runtime still scales captains x1.2 and bosses x1.55.</summary>
|
||||
public const float EnemyHeight = 1.2f;
|
||||
static Material _cream, _rock, _orange, _leaf, _dark, _white, _cyan, _grass, _path, _monster, _yellow, _water, _ember, _violet;
|
||||
@@ -305,6 +305,12 @@ public static class BuildPrototype
|
||||
if (child.name == "Ground" || child.name == "Lane" || child.name == "LeftBorder" || child.name == "RightBorder" || child.name == "BattleLight") child.gameObject.SetActive(false);
|
||||
}
|
||||
var enemyFeedback = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/Effects/EnemyCombat/EnemyCombatPresentation.prefab");
|
||||
var skillFeedback = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/Combat/BattleSkillPresentation.prefab");
|
||||
if(skillFeedback!=null)
|
||||
{
|
||||
foreach(string group in new[]{"Heroes","Enemies"})foreach(Transform actor in root.transform.Find(group)){var muzzle=new GameObject("SkillMuzzle").transform;muzzle.SetParent(actor,false);muzzle.localPosition=new Vector3(0,group=="Heroes"?.85f:.8f,-.48f);muzzle.gameObject.layer=30;}
|
||||
PrefabUtility.InstantiatePrefab(skillFeedback,root.transform);
|
||||
}
|
||||
if (enemyFeedback != null) PrefabUtility.InstantiatePrefab(enemyFeedback, root.transform);
|
||||
PrefabUtility.SaveAsPrefabAsset(root, World + "/PrototypeArena.prefab");
|
||||
}
|
||||
@@ -390,7 +396,7 @@ public static class BuildPrototype
|
||||
var enemies = root.transform.Find("Enemies") ?? throw new Exception("Arena missing Enemies");
|
||||
foreach (Transform slot in enemies)
|
||||
{
|
||||
foreach (var child in slot.Cast<Transform>().Where(c => c.name != "SlowMark").ToArray()) UnityEngine.Object.DestroyImmediate(child.gameObject);
|
||||
foreach (var child in slot.Cast<Transform>().Where(c => c.name != "SlowMark" && c.name != "SkillMuzzle").ToArray()) UnityEngine.Object.DestroyImmediate(child.gameObject);
|
||||
if (!FormalEnemyVisuals(slot)) throw new Exception("Formal enemy prefabs incomplete: " + string.Join(", ", FormalEnemies.Where(p => AssetDatabase.LoadAssetAtPath<GameObject>(p) == null)));
|
||||
}
|
||||
PrefabUtility.SaveAsPrefabAsset(root, World + "/PrototypeArena.prefab");
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using HotUpdate.Gameplay;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEditor.SceneManagement;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using Object=UnityEngine.Object;
|
||||
|
||||
/// <summary>Persistent, independent skill review. Never edits the production arena or account.</summary>
|
||||
public static class BuildSkillSlice
|
||||
{
|
||||
public const string Folder="Assets/Bundles/Combat/SkillSlice";
|
||||
public const string Prefab=Folder+"/SkillSlice.prefab";
|
||||
public const string Scene="Assets/Bundles/Scenes/Review/SkillSlice_Review.unity";
|
||||
static readonly string[] Names={"FireCharge","Fireball","FireHit","RockHit","Shield"};
|
||||
static readonly string[] SoundNames={"FireCharge","FireLaunch","FireHit","RockHit","Shield"};
|
||||
static void Folders(string path){if(AssetDatabase.IsValidFolder(path))return;string parent=Path.GetDirectoryName(path).Replace('\\','/');Folders(parent);AssetDatabase.CreateFolder(parent,Path.GetFileName(path));}
|
||||
static ParticleSystem Part(Transform parent,string name,Color color,int count,float life,float size,bool loop=false,Mesh mesh=null)
|
||||
{
|
||||
var go=new GameObject(name);go.transform.SetParent(parent,false);go.layer=30;var ps=go.AddComponent<ParticleSystem>();
|
||||
var main=ps.main;main.playOnAwake=false;main.loop=loop;main.duration=.5f;main.startLifetime=life;main.startSpeed=mesh!=null?0:.25f;main.startSize=size;main.startColor=color;main.maxParticles=32;main.simulationSpace=ParticleSystemSimulationSpace.Local;
|
||||
var emission=ps.emission;emission.rateOverTime=loop?count:0;if(!loop)emission.SetBursts(new[]{new ParticleSystem.Burst(0,(short)count)});
|
||||
var shape=ps.shape;shape.shapeType=ParticleSystemShapeType.Sphere;shape.radius=loop?.035f:.08f;
|
||||
var colorLife=ps.colorOverLifetime;colorLife.enabled=true;var gradient=new Gradient();gradient.SetKeys(new[]{new GradientColorKey(Color.white,0),new GradientColorKey(color,1)},new[]{new GradientAlphaKey(.85f,0),new GradientAlphaKey(0,1)});colorLife.color=gradient;
|
||||
var sizeLife=ps.sizeOverLifetime;sizeLife.enabled=true;sizeLife.size=new ParticleSystem.MinMaxCurve(1,AnimationCurve.Linear(0,1,1,.1f));
|
||||
var renderer=ps.GetComponent<ParticleSystemRenderer>();renderer.sharedMaterial=AssetDatabase.LoadAssetAtPath<Material>("Assets/Bundles/Effects/EnemyCombat/CombatGlow.mat");renderer.renderMode=mesh==null?ParticleSystemRenderMode.Billboard:ParticleSystemRenderMode.Mesh;if(mesh!=null)renderer.mesh=mesh;
|
||||
return ps;
|
||||
}
|
||||
static float Height(Transform root)
|
||||
{
|
||||
float top=0;var mesh=new Mesh();foreach(var skin in root.GetComponentsInChildren<SkinnedMeshRenderer>(true)){skin.BakeMesh(mesh,true);foreach(var v in mesh.vertices)top=Mathf.Max(top,root.InverseTransformPoint(skin.transform.TransformPoint(v)).y);}Object.DestroyImmediate(mesh);return top;
|
||||
}
|
||||
public static string Build()
|
||||
{
|
||||
if(EditorApplication.isPlaying)throw new Exception("Author in Edit Mode");Folders(Folder);
|
||||
AssetDatabase.ImportAsset(Folder+"/trace.json",ImportAssetOptions.ForceUpdate);var trace=AssetDatabase.LoadAssetAtPath<TextAsset>(Folder+"/trace.json");var data=JObject.Parse(trace.text);
|
||||
var previous=SceneManager.GetActiveScene();var scene=EditorSceneManager.NewScene(NewSceneSetup.EmptyScene,NewSceneMode.Additive);
|
||||
try
|
||||
{
|
||||
SceneManager.SetActiveScene(scene);var root=new GameObject("SkillSlice");var player=root.AddComponent<SkillSlicePlayer>();
|
||||
var camera=new GameObject("SkillSliceCamera").AddComponent<Camera>();camera.transform.SetParent(root.transform,false);camera.transform.localPosition=new Vector3(8,9,-11);camera.transform.LookAt(new Vector3(0,.5f,1.1f));camera.orthographic=true;camera.orthographicSize=4.4f;camera.cullingMask=1<<30;camera.clearFlags=CameraClearFlags.SolidColor;camera.backgroundColor=new Color(.09f,.13f,.17f);camera.depth=100;
|
||||
var light=new GameObject("SkillSliceLight").AddComponent<Light>();light.transform.SetParent(root.transform,false);light.type=LightType.Directional;light.intensity=1.3f;light.transform.rotation=Quaternion.Euler(40,-35,0);light.cullingMask=1<<30;
|
||||
var floor=GameObject.CreatePrimitive(PrimitiveType.Plane);floor.name="Ground_Y0";floor.transform.SetParent(root.transform,false);floor.transform.localScale=new Vector3(.6f,1,1);floor.transform.localPosition=new Vector3(0,-.005f,1);floor.GetComponent<Renderer>().sharedMaterial=AssetDatabase.LoadAssetAtPath<Material>("Assets/Bundles/Scenes/Review/EnemyReviewFloor.mat");Object.DestroyImmediate(floor.GetComponent<Collider>());
|
||||
var so=new SerializedObject(player);so.FindProperty("_trace").objectReferenceValue=trace;
|
||||
var views=so.FindProperty("_views");views.arraySize=((JArray)data["initial"]).Count;
|
||||
int index=0;
|
||||
foreach(var u in (JArray)data["initial"])
|
||||
{
|
||||
int id=(int)u["id"];string actor=id==0?"RockBall":id==1?"FireCat":"Hornlet",kind=id<100?"Animal":"Enemy";
|
||||
var slot=new GameObject("Entity"+id).transform;slot.SetParent(root.transform,false);slot.localPosition=new Vector3(0,0,(int)u["z"]/1000f);slot.localRotation=Quaternion.Euler(0,id<100?180:0,0);
|
||||
string suffix=id<100?"Companion":"Enemy";var model=(GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/Characters/"+kind+"/"+actor+"Studio/"+actor+"Studio_"+suffix+".prefab"),slot);
|
||||
model.transform.localScale=Vector3.one*((id<100?1.5f:1.2f)/Height(model.transform));
|
||||
var muzzle=new GameObject("Muzzle").transform;muzzle.SetParent(slot,false);muzzle.localPosition=new Vector3(0,.8f,-.48f);
|
||||
var label=new GameObject("State").AddComponent<TextMesh>();label.transform.SetParent(slot,false);label.transform.localPosition=new Vector3(0,1.85f,0);label.transform.rotation=camera.transform.rotation;label.fontSize=60;label.characterSize=.032f;label.anchor=TextAnchor.MiddleCenter;label.color=Color.white;
|
||||
string recipe="../Config/Art/"+(id==1?"Companions":"EnemyCharacters")+"/"+actor+".json";float impact=(float)JObject.Parse(File.ReadAllText(recipe))["attackImpact"];
|
||||
var v=views.GetArrayElementAtIndex(index++);v.FindPropertyRelative("id").intValue=id;v.FindPropertyRelative("root").objectReferenceValue=slot;v.FindPropertyRelative("muzzle").objectReferenceValue=muzzle;v.FindPropertyRelative("label").objectReferenceValue=label;v.FindPropertyRelative("animator").objectReferenceValue=model.GetComponentInChildren<Animator>();v.FindPropertyRelative("impact").floatValue=impact;
|
||||
}
|
||||
var ring=AssetDatabase.LoadAssetAtPath<Mesh>("Assets/Bundles/Effects/EnemyCombat/CombatRing.asset");
|
||||
const string corePath=Folder+"/FireballCore.asset";var core=AssetDatabase.LoadAssetAtPath<Mesh>(corePath);
|
||||
if(core==null){var sphere=GameObject.CreatePrimitive(PrimitiveType.Sphere);core=Object.Instantiate(sphere.GetComponent<MeshFilter>().sharedMesh);core.name="FireballCore";Object.DestroyImmediate(sphere);AssetDatabase.CreateAsset(core,corePath);}
|
||||
var effects=so.FindProperty("_effects");effects.arraySize=5;
|
||||
for(int i=0;i<5;i++)
|
||||
{
|
||||
bool loop=i==0||i==1||i==4;Color color=i==4?new Color(.35f,.85f,1):i==3?new Color(1,.78f,.35f):new Color(1,.28f,.025f);
|
||||
var authored=Part(root.transform,"Vfx_Skill_"+Names[i],color,loop?12:14,i==4?.35f:i<2?.2f:.35f,i==4?2.3f:i==1?.45f:i==0?.25f:.15f,loop,i==4?ring:null);
|
||||
if(i<4){var renderer=authored.GetComponent<ParticleSystemRenderer>();renderer.renderMode=ParticleSystemRenderMode.Mesh;renderer.mesh=core;}
|
||||
if(i==4){var main=authored.main;main.startColor=new Color(.35f,.85f,1,.22f);main.startSize=1.8f;main.startLifetime=.6f;var emission=authored.emission;emission.rateOverTime=4;}
|
||||
if(i==2||i==3){var flash=Part(authored.transform,"ImpactRing",color,1,.25f,1.35f,false,ring);var size=flash.sizeOverLifetime;size.size=new ParticleSystem.MinMaxCurve(1,AnimationCurve.Linear(0,.3f,1,1.2f));}
|
||||
if(i==1)Part(authored.transform,"BrightCore",new Color(1,.85f,.25f),20,.12f,.2f,true);
|
||||
var asset=PrefabUtility.SaveAsPrefabAsset(authored.gameObject,Folder+"/Vfx_Skill_"+Names[i]+".prefab");Object.DestroyImmediate(authored.gameObject);
|
||||
var instances=effects.GetArrayElementAtIndex(i).FindPropertyRelative("instances");instances.arraySize=i==1?8:4;
|
||||
for(int n=0;n<instances.arraySize;n++){var go=(GameObject)PrefabUtility.InstantiatePrefab(asset,root.transform);instances.GetArrayElementAtIndex(n).objectReferenceValue=go.GetComponent<ParticleSystem>();}
|
||||
}
|
||||
var clips=so.FindProperty("_clips");clips.arraySize=5;
|
||||
for(int i=0;i<5;i++)
|
||||
{
|
||||
string path="Assets/Bundles/Sound/SFX/BattleSkills/Sfx_"+SoundNames[i]+".wav";AssetDatabase.ImportAsset(path,ImportAssetOptions.ForceUpdate);var importer=(AudioImporter)AssetImporter.GetAtPath(path);if(importer==null)throw new Exception("Missing "+path);
|
||||
var sample=importer.defaultSampleSettings;sample.loadType=AudioClipLoadType.DecompressOnLoad;sample.compressionFormat=AudioCompressionFormat.PCM;sample.sampleRateSetting=AudioSampleRateSetting.PreserveSampleRate;importer.defaultSampleSettings=sample;importer.forceToMono=false;importer.SaveAndReimport();clips.GetArrayElementAtIndex(i).objectReferenceValue=AssetDatabase.LoadAssetAtPath<AudioClip>(path);
|
||||
}
|
||||
var voices=so.FindProperty("_voices");voices.arraySize=8;
|
||||
for(int i=0;i<8;i++){var go=new GameObject("Voice"+i);go.transform.SetParent(root.transform,false);var voice=go.AddComponent<AudioSource>();voice.playOnAwake=false;voice.spatialBlend=0;voice.volume=.7f/8;voices.GetArrayElementAtIndex(i).objectReferenceValue=voice;}
|
||||
var feedback=(GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/Effects/EnemyCombat/EnemyCombatPresentation.prefab"),root.transform);so.FindProperty("_enemyFeedback").objectReferenceValue=feedback.GetComponent<EnemyCombatPresentation>();
|
||||
var status=new GameObject("TraceStatus").AddComponent<TextMesh>();status.transform.SetParent(root.transform,false);status.transform.localPosition=new Vector3(0,.3f,-3.5f);status.transform.rotation=camera.transform.rotation;status.fontSize=60;status.characterSize=.04f;status.anchor=TextAnchor.MiddleCenter;status.color=new Color(.8f,.95f,1);so.FindProperty("_status").objectReferenceValue=status;
|
||||
so.ApplyModifiedPropertiesWithoutUndo();foreach(var t in root.GetComponentsInChildren<Transform>(true))t.gameObject.layer=30;
|
||||
PrefabUtility.SaveAsPrefabAsset(root,Prefab);Object.DestroyImmediate(root);
|
||||
PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(Prefab),scene);EditorSceneManager.SaveScene(scene,Scene);AssetDatabase.SaveAssets();return "Saved independent "+Prefab+" and "+Scene;
|
||||
}
|
||||
finally{SceneManager.SetActiveScene(previous);EditorSceneManager.CloseScene(scene,true);}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,150 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEditor.SceneManagement;
|
||||
using UnityEngine;
|
||||
|
||||
/// <summary>
|
||||
/// T2 evolution visuals: each partner keeps its validated T1 prefab (mesh, rig, clips) and gains one evolution accessory
|
||||
/// parented to its own head bone (RockRhino: chest/back). Output {Name}_T2.prefab variants, then nest them as Heroes/HeroN/VisualT2.
|
||||
/// Accessory statics come from SetupCharacter at Characters/Animal/{Name}/{Name}T2/.
|
||||
/// </summary>
|
||||
public static class BuildT2Visuals
|
||||
{
|
||||
const string Animal = "Assets/Bundles/Characters/Animal/";
|
||||
const string Arena = "Assets/Bundles/Scenes/Prototype/PrototypeArena.prefab";
|
||||
const int BattleLayer = 30;
|
||||
|
||||
sealed class Spec
|
||||
{
|
||||
public int Pet; public string Name, T1;
|
||||
/// <summary>Accessory width as a fraction of the anchor region's width; Back mounts on the chest instead of the head.</summary>
|
||||
public float Width = .75f, Drop; public bool Back; public string Bone;
|
||||
// Bone is set where the top-most vertices are not the mount: RockBall's small crystal tip (BubbleTurtle wears it on the shell top on purpose), ThunderLeopard's ears. Drop lowers the mount by a fraction of the height (SparkBird's crest otherwise lifts it).
|
||||
}
|
||||
|
||||
static readonly Spec[] Specs =
|
||||
{
|
||||
new Spec { Pet = 0, Name = "RockBall", T1 = "RockBallStudio/RockBallStudio_Companion.prefab", Width = .55f, Bone = "bone_1" },
|
||||
new Spec { Pet = 1, Name = "FireCat", T1 = "FireCatStudio/FireCatStudio_Companion.prefab", Width = .55f },
|
||||
new Spec { Pet = 2, Name = "BudBud", T1 = "BudBudStudio/BudBudStudio_Companion.prefab", Width = .5f },
|
||||
new Spec { Pet = 3, Name = "SparkBird", T1 = "SparkBirdStudio/SparkBirdStudio_Companion.prefab", Width = .6f, Drop = .1f },
|
||||
new Spec { Pet = 4, Name = "BubbleTurtle", T1 = "BubbleTurtle/BubbleTurtle_Companion.prefab", Width = .55f },
|
||||
new Spec { Pet = 5, Name = "RockRhino", T1 = "RockRhinoStudio/RockRhinoStudio_Companion.prefab", Width = .55f, Back = true, Bone = "bone_1" },
|
||||
new Spec { Pet = 6, Name = "FlameLion", T1 = "FlameLion/FlameLion_Companion.prefab", Width = .55f },
|
||||
new Spec { Pet = 7, Name = "VineSprite", T1 = "VineSpriteStudio/VineSpriteStudio_Companion.prefab", Width = .8f },
|
||||
new Spec { Pet = 8, Name = "ThunderLeopard", T1 = "ThunderLeopardStudio/ThunderLeopardStudio_Companion.prefab", Width = .6f, Bone = "bone_4" },
|
||||
new Spec { Pet = 9, Name = "TideWhale", T1 = "TideWhaleStudio/TideWhaleStudio_Companion.prefab", Width = .55f },
|
||||
};
|
||||
|
||||
static string AccessoryPath(Spec s) => Animal + s.Name + "/" + s.Name + "T2/" + s.Name + "T2.prefab";
|
||||
static string T2Path(Spec s) => Animal + s.Name + "/" + s.Name + "_T2.prefab";
|
||||
static void SetLayer(Transform t) { t.gameObject.layer = BattleLayer; foreach (Transform c in t) SetLayer(c); }
|
||||
|
||||
/// <summary>Bind-pose skinned points in <paramref name="space"/> with the dominant bone of each vertex.</summary>
|
||||
static List<(Vector3 p, Transform bone)> Skin(GameObject root, Transform space)
|
||||
{
|
||||
var result = new List<(Vector3, Transform)>(); var mesh = new Mesh();
|
||||
try
|
||||
{
|
||||
foreach (var skin in root.GetComponentsInChildren<SkinnedMeshRenderer>(true))
|
||||
{
|
||||
skin.BakeMesh(mesh, true); var weights = skin.sharedMesh.boneWeights; var bones = skin.bones; var v = mesh.vertices;
|
||||
for (int i = 0; i < v.Length; i++) result.Add((space.InverseTransformPoint(skin.transform.TransformPoint(v[i])), bones[weights[i].boneIndex0]));
|
||||
}
|
||||
}
|
||||
finally { UnityEngine.Object.DestroyImmediate(mesh); }
|
||||
return result;
|
||||
}
|
||||
|
||||
static Bounds MeshBounds(GameObject go, Transform space)
|
||||
{
|
||||
var points = go.GetComponentsInChildren<MeshFilter>(true).SelectMany(f => f.sharedMesh.vertices.Select(v => space.InverseTransformPoint(f.transform.TransformPoint(v)))).ToArray();
|
||||
var b = new Bounds(points[0], Vector3.zero); foreach (var p in points) b.Encapsulate(p); return b;
|
||||
}
|
||||
|
||||
/// <summary>Builds {Name}_T2.prefab for every partner whose accessory static exists; returns one line per partner.</summary>
|
||||
public static string BuildPrefabs()
|
||||
{
|
||||
if (EditorApplication.isPlaying) throw new Exception("Build T2 visuals in Edit Mode");
|
||||
var lines = new List<string>();
|
||||
var scene = EditorSceneManager.NewPreviewScene();
|
||||
try
|
||||
{
|
||||
foreach (var s in Specs)
|
||||
{
|
||||
var accessory = AssetDatabase.LoadAssetAtPath<GameObject>(AccessoryPath(s));
|
||||
if (accessory == null) { lines.Add(s.Name + ": accessory missing, skipped"); continue; }
|
||||
var t1 = AssetDatabase.LoadAssetAtPath<GameObject>(Animal + s.T1) ?? throw new Exception("Missing T1 " + s.T1);
|
||||
var root = (GameObject)PrefabUtility.InstantiatePrefab(t1, scene);
|
||||
var points = Skin(root, root.transform);
|
||||
float h = points.Max(x => x.p.y) - points.Min(x => x.p.y);
|
||||
// Anchor bone: the named one, else the bone owning most of the top 3% of vertices (the head).
|
||||
Transform bone = s.Bone != null ? root.GetComponentsInChildren<Transform>(true).First(t => t.name == s.Bone)
|
||||
: points.OrderByDescending(x => x.p.y).Take(Math.Max(1, points.Count * 3 / 100)).GroupBy(x => x.bone).OrderByDescending(g => g.Count()).First().Key;
|
||||
var region = points.Where(x => x.bone == bone).Select(x => x.p).ToArray();
|
||||
float cx = (region.Min(p => p.x) + region.Max(p => p.x)) / 2, width = region.Max(p => p.x) - region.Min(p => p.x);
|
||||
var crown = region.Where(p => Mathf.Abs(p.x - cx) < width * .2f).ToArray();
|
||||
var top = crown.OrderByDescending(p => p.y).First();
|
||||
float cz = crown.Where(p => p.y > top.y - h * .06f).Average(p => p.z);
|
||||
|
||||
var acc = (GameObject)PrefabUtility.InstantiatePrefab(accessory, scene); acc.name = "T2Accessory";
|
||||
acc.transform.SetParent(root.transform, false);
|
||||
var b = MeshBounds(acc, acc.transform);
|
||||
float scale = s.Width * width / Mathf.Max(1e-4f, Mathf.Max(b.size.x, b.size.z));
|
||||
acc.transform.localScale = Vector3.one * scale;
|
||||
// Sink the base a quarter of its height into the head/back so it reads as worn, not floating.
|
||||
float accHeight = b.size.y * scale;
|
||||
acc.transform.localPosition = new Vector3(cx - b.center.x * scale, top.y - b.min.y * scale - accHeight * .25f - s.Drop * h, cz - b.center.z * scale);
|
||||
acc.transform.SetParent(bone, true);
|
||||
PrefabUtility.SaveAsPrefabAsset(root, T2Path(s));
|
||||
lines.Add(s.Name + ": " + T2Path(s) + " bone=" + bone.name + " width=" + width.ToString("F3") + " accScale=" + scale.ToString("F3") + " top=" + (top.y + accHeight * .75f).ToString("F3") + "/" + h.ToString("F3"));
|
||||
UnityEngine.Object.DestroyImmediate(root);
|
||||
}
|
||||
}
|
||||
finally { EditorSceneManager.ClosePreviewScene(scene); }
|
||||
return string.Join("\n", lines);
|
||||
}
|
||||
|
||||
/// <summary>Nests each {Name}_T2 prefab as Heroes/HeroN/VisualT2 (inactive, same scale as Visual); runtime shows it for tier 2.</summary>
|
||||
public static string ApplyArena()
|
||||
{
|
||||
if (EditorApplication.isPlaying) throw new Exception("Apply T2 visuals in Edit Mode");
|
||||
var root = PrefabUtility.LoadPrefabContents(Arena); var done = new List<int>();
|
||||
try
|
||||
{
|
||||
foreach (var s in Specs)
|
||||
{
|
||||
var t2 = AssetDatabase.LoadAssetAtPath<GameObject>(T2Path(s)); if (t2 == null) continue;
|
||||
var hero = root.transform.Find("Heroes/Hero" + s.Pet) ?? throw new Exception("Arena missing Hero" + s.Pet);
|
||||
var visual = hero.Find("Visual") ?? throw new Exception("Hero" + s.Pet + " has no formal T1 Visual");
|
||||
var old = hero.Find("VisualT2"); if (old != null) UnityEngine.Object.DestroyImmediate(old.gameObject);
|
||||
var go = (GameObject)PrefabUtility.InstantiatePrefab(t2, root.scene); go.name = "VisualT2";
|
||||
go.transform.SetParent(hero, false); go.transform.localPosition = visual.localPosition; go.transform.localRotation = visual.localRotation; go.transform.localScale = visual.localScale;
|
||||
SetLayer(go.transform); go.SetActive(false); done.Add(s.Pet);
|
||||
}
|
||||
PrefabUtility.SaveAsPrefabAsset(root, Arena);
|
||||
}
|
||||
finally { PrefabUtility.UnloadPrefabContents(root); }
|
||||
return "Arena VisualT2 nested for heroes " + string.Join(",", done);
|
||||
}
|
||||
|
||||
public static string Verify()
|
||||
{
|
||||
var arena = AssetDatabase.LoadAssetAtPath<GameObject>(Arena); var lines = new List<string>();
|
||||
foreach (var s in Specs)
|
||||
{
|
||||
var t2 = AssetDatabase.LoadAssetAtPath<GameObject>(T2Path(s)); if (t2 == null) { lines.Add(s.Name + "=missing"); continue; }
|
||||
var acc = t2.GetComponentsInChildren<Transform>(true).FirstOrDefault(t => t.name == "T2Accessory");
|
||||
if (acc == null || acc.parent == t2.transform || acc.GetComponentInParent<SkinnedMeshRenderer>() != null) throw new Exception(s.Name + " accessory not parented to a bone");
|
||||
if (PrefabUtility.GetCorrespondingObjectFromSource(t2) == null) throw new Exception(s.Name + "_T2 is not a variant of its T1 prefab");
|
||||
var hero = arena.transform.Find("Heroes/Hero" + s.Pet); var v2 = hero?.Find("VisualT2");
|
||||
if (v2 == null || v2.gameObject.activeSelf || v2.GetComponentsInChildren<Transform>(true).Any(t => t.gameObject.layer != BattleLayer)) throw new Exception("Hero" + s.Pet + " VisualT2 missing/active/wrong layer");
|
||||
if ((v2.localScale - hero.Find("Visual").localScale).sqrMagnitude > 1e-8f) throw new Exception("Hero" + s.Pet + " VisualT2 scale differs from Visual");
|
||||
lines.Add(s.Name + "=" + acc.parent.name);
|
||||
}
|
||||
return "PASS T2 " + string.Join(", ", lines);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using AIGame.EditorTools;
|
||||
using UnityEditor;
|
||||
|
||||
public static class BuildTreasure
|
||||
{
|
||||
public static string Build()
|
||||
{
|
||||
if (EditorApplication.isPlaying) throw new Exception("Build the friends page in Edit Mode");
|
||||
string repo = Directory.GetParent(UnityEngine.Application.dataPath).Parent.FullName;
|
||||
if (string.IsNullOrEmpty(JsonUIPrefabBuilder.BuildFromJsonFile(Path.Combine(repo, "Doc/UIPrefabCreater/UI_PrototypeFriends.json")))) throw new Exception("Friends prefab failed");
|
||||
SetupUiBundleCollector.Setup();
|
||||
AssetDatabase.SaveAssets();
|
||||
return "Built the treasure button";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,187 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
using UnityEditor;
|
||||
using UnityEditor.SceneManagement;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using Object=UnityEngine.Object;
|
||||
|
||||
/// <summary>Isolated candidate uses the ORIGINAL avatar, controller and finished clips. No animation regeneration.</summary>
|
||||
public static class GreatHornStudioTrial
|
||||
{
|
||||
const string Original="Assets/Bundles/Characters/Enemy/GreatHorn";
|
||||
const string Trial="Assets/Bundles/Characters/Enemy/GreatHornStudio";
|
||||
const string ScenePath="Assets/Bundles/Scenes/Review/Enemy_GreatHornStudio_Review.unity";
|
||||
static string Repo=>Path.GetFullPath(Path.Combine(Application.dataPath,"../.."));
|
||||
static void Check(bool value,string message){if(!value)throw new Exception(message);}
|
||||
static void Write(string name,object data){string dir=Path.Combine(Repo,"Tools/output/enemy_studio_trial/GreatHorn");Directory.CreateDirectory(dir);File.WriteAllText(Path.Combine(dir,name),JsonConvert.SerializeObject(data,Formatting.Indented));}
|
||||
static Vector3[] Vertices(GameObject go)
|
||||
{
|
||||
return go.GetComponentsInChildren<SkinnedMeshRenderer>().SelectMany(s=>{
|
||||
var m=s.sharedMesh;var weights=m.boneWeights;var binds=m.bindposes;var matrices=s.bones.Select((b,i)=>b.localToWorldMatrix*binds[i]).ToArray();
|
||||
return m.vertices.Select((v,i)=>{var w=weights[i];return matrices[w.boneIndex0].MultiplyPoint3x4(v)*w.weight0+matrices[w.boneIndex1].MultiplyPoint3x4(v)*w.weight1+matrices[w.boneIndex2].MultiplyPoint3x4(v)*w.weight2+matrices[w.boneIndex3].MultiplyPoint3x4(v)*w.weight3;}).ToArray();
|
||||
}).ToArray();
|
||||
}
|
||||
static Bounds Bounds(Vector3[] points){var b=new Bounds(points[0],Vector3.zero);foreach(var p in points)b.Encapsulate(p);return b;}
|
||||
static AnimationClip Clip(string name)=>AssetDatabase.LoadAssetAtPath<AnimationClip>(Original+"/Clips/"+name+".anim");
|
||||
public static string Inspect()
|
||||
{
|
||||
var prefab=AssetDatabase.LoadAssetAtPath<GameObject>(Original+"/GreatHorn_Enemy.prefab");var anim=prefab.GetComponentInChildren<Animator>();
|
||||
return JsonConvert.SerializeObject(new{model=anim.name,scale=anim.transform.localScale.ToString("F6"),position=anim.transform.localPosition.ToString("F6"),rotation=anim.transform.localEulerAngles.ToString("F6"),avatar=AssetDatabase.GetAssetPath(anim.avatar),controller=AssetDatabase.GetAssetPath(anim.runtimeAnimatorController),bones=prefab.GetComponentsInChildren<Transform>().Where(t=>t.name.StartsWith("bone_")).Select(t=>new{name=t.name,path=AnimationUtility.CalculateTransformPath(t,anim.transform),position=t.localPosition.ToString("F6"),rotation=t.localRotation.ToString("F6")}).ToArray()},Formatting.Indented);
|
||||
}
|
||||
public static string Build()=>BuildCore(true);
|
||||
public static string Prepare()=>BuildCore(false);
|
||||
static string BuildCore(bool verify)
|
||||
{
|
||||
Check(!EditorApplication.isPlaying,"Author trial in Edit Mode");
|
||||
string fbx=Trial+"/Rigged/GreatHornStudio_Rigged.fbx";
|
||||
AssetDatabase.ImportAsset(fbx,ImportAssetOptions.ForceUpdate);
|
||||
var imp=(ModelImporter)AssetImporter.GetAtPath(fbx);imp.animationType=ModelImporterAnimationType.Generic;imp.avatarSetup=ModelImporterAvatarSetup.CreateFromThisModel;imp.importAnimation=false;imp.globalScale=1;imp.useFileScale=false;imp.bakeAxisConversion=true;imp.materialImportMode=ModelImporterMaterialImportMode.None;imp.meshCompression=ModelImporterMeshCompression.Off;imp.SaveAndReimport();
|
||||
var reference=AssetDatabase.LoadAssetAtPath<GameObject>(Original+"/GreatHorn_Enemy.prefab").GetComponentInChildren<Animator>();
|
||||
var scene=EditorSceneManager.NewPreviewScene();
|
||||
try
|
||||
{
|
||||
var root=new GameObject("GreatHornStudio_Enemy");SceneManager.MoveGameObjectToScene(root,scene);
|
||||
var model=(GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(fbx),scene);model.transform.SetParent(root.transform,false);model.name="Model";
|
||||
model.transform.localPosition=reference.transform.localPosition;model.transform.localRotation=reference.transform.localRotation;model.transform.localScale=reference.transform.localScale;
|
||||
var anim=model.GetComponent<Animator>();if(anim==null)anim=model.AddComponent<Animator>();anim.avatar=reference.avatar;anim.runtimeAnimatorController=reference.runtimeAnimatorController;anim.applyRootMotion=false;anim.cullingMode=AnimatorCullingMode.AlwaysAnimate;
|
||||
var material=AssetDatabase.LoadAssetAtPath<Material>(Trial+"/GreatHornStudio.mat");foreach(var skin in model.GetComponentsInChildren<SkinnedMeshRenderer>()) {skin.sharedMaterial=material;skin.updateWhenOffscreen=true;}
|
||||
var expected=reference.GetComponentsInChildren<Transform>().Where(t=>t.name.StartsWith("bone_")).ToDictionary(t=>AnimationUtility.CalculateTransformPath(t,reference.transform));
|
||||
var actual=model.GetComponentsInChildren<Transform>().Where(t=>t.name.StartsWith("bone_")).ToDictionary(t=>AnimationUtility.CalculateTransformPath(t,model.transform));
|
||||
Check(expected.Count==22&&expected.Keys.OrderBy(x=>x).SequenceEqual(actual.Keys.OrderBy(x=>x)),"Original skeleton paths changed");
|
||||
foreach(var entry in expected){var t=actual[entry.Key];Check(Vector3.Distance(t.localPosition,entry.Value.localPosition)<.0001f&&Quaternion.Angle(t.localRotation,entry.Value.localRotation)<.01f&&Vector3.Distance(t.localScale,entry.Value.localScale)<.0001f,"Bind transform changed "+entry.Key);}
|
||||
PrefabUtility.SaveAsPrefabAsset(root,Trial+"/GreatHornStudio_Enemy.prefab");
|
||||
}
|
||||
finally{EditorSceneManager.ClosePreviewScene(scene);}
|
||||
AssetDatabase.SaveAssets();return verify?Verify():"Prepared original skeleton/controller candidate; sole constraints pending";
|
||||
}
|
||||
public static string Verify()
|
||||
{
|
||||
var scene=EditorSceneManager.NewPreviewScene();
|
||||
try
|
||||
{
|
||||
var go=(GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(Trial+"/GreatHornStudio_Enemy.prefab"),scene);var anim=go.GetComponentInChildren<Animator>();anim.enabled=false;
|
||||
var reference=AssetDatabase.LoadAssetAtPath<GameObject>(Original+"/GreatHorn_Enemy.prefab").GetComponentInChildren<Animator>();Check(anim.runtimeAnimatorController==reference.runtimeAnimatorController&&anim.avatar==reference.avatar,"Expected exact original controller/avatar");
|
||||
var bind=Vertices(go);var bounds=Bounds(bind);int triangles=go.GetComponentsInChildren<SkinnedMeshRenderer>().Sum(s=>s.sharedMesh.triangles.Length/3);Check(triangles<=2600,"Studio target tolerance exceeded");Check(Mathf.Abs(bounds.size.y-.8f)<.003f&&Mathf.Abs(bounds.min.y)<.003f,"Bind ground/height changed "+bounds);
|
||||
var staticGo=(GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(Trial+"/GreatHornStudio.prefab"),scene);var staticPoints=staticGo.GetComponentsInChildren<MeshFilter>().SelectMany(m=>m.sharedMesh.vertices.Select(v=>m.transform.TransformPoint(v))).ToArray();float bindError=bind.Max(v=>staticPoints.Min(p=>Vector3.Distance(v,p)));Check(bindError<.002f,"Weight transfer changed static geometry "+bindError);
|
||||
Check(go.GetComponentsInChildren<SkinnedMeshRenderer>().All(s=>s.sharedMesh.boneWeights.All(w=>Mathf.Abs(w.weight0+w.weight1+w.weight2+w.weight3-1)<.001f)),"Invalid weights");
|
||||
var rows=new List<object>();var root=go.GetComponentsInChildren<Transform>().Single(t=>t.name=="bone_0");
|
||||
foreach(string name in new[]{"Idle","Walk","Attack"})
|
||||
{
|
||||
var clip=Clip(name);Check(anim.runtimeAnimatorController.animationClips.Contains(clip),"Not original clip "+name);
|
||||
foreach(var binding in AnimationUtility.GetCurveBindings(clip))Check(string.IsNullOrEmpty(binding.path)||anim.transform.Find(binding.path)!=null,"Unbound original curve "+binding.path);
|
||||
Vector3[] start=null,end=null;float minY=float.MaxValue,maxY=float.MinValue,movement=0,tilt=0;Vector3 rootStart=Vector3.zero;float drift=0;
|
||||
for(int frame=0;frame<=120;frame++) {clip.SampleAnimation(anim.gameObject,clip.length*frame/120);var points=Vertices(go);Check(points.All(p=>!float.IsNaN(p.x)&&!float.IsInfinity(p.x)),"Invalid mesh");var b=Bounds(points);if(frame==0){start=points;rootStart=root.position;}if(frame==120)end=points;minY=Mathf.Min(minY,b.min.y);maxY=Mathf.Max(maxY,b.min.y);movement=Mathf.Max(movement,points.Select((p,i)=>Vector3.Distance(p,start[i])).Max());tilt=Mathf.Max(tilt,Vector3.Angle(root.up,Vector3.up));drift=Mathf.Max(drift,Vector2.Distance(new Vector2(root.position.x,root.position.z),new Vector2(rootStart.x,rootStart.z)));Check(b.size.y>.64f,"Collapsed mesh "+name);}
|
||||
float seam=start.Select((p,i)=>Vector3.Distance(p,end[i])).Max();Check(minY>=-.003f&&maxY<=.003f,"Ground contact failed "+name+" "+minY+".."+maxY);Check(tilt<25&&seam<.001f,"Orientation/seam failed "+name);Check(movement>.0002f,"Motion invisible "+name);
|
||||
rows.Add(new{name,originalClip=AssetDatabase.GetAssetPath(clip),frames=121,minY,maxY,movement,tilt,drift,seam});
|
||||
}
|
||||
Write("unity_verification.json",new{status="pass",triangles,bones=22,bindError,bindHeight=bounds.size.y,originalAvatar=true,originalController=true,originalClips=true,rows});return "PASS original 22-bone bind, exact original avatar/controller/3 clips, static geometry, weights and 121-frame motion samples";
|
||||
}
|
||||
finally{EditorSceneManager.ClosePreviewScene(scene);}
|
||||
}
|
||||
static void Label(Transform parent,string text,Vector3 position,float size)
|
||||
{var label=new GameObject("Label_"+text).AddComponent<TextMesh>();label.transform.SetParent(parent,false);label.transform.localPosition=position;label.transform.localRotation=Quaternion.Euler(12,0,0);label.text=text;label.fontSize=60;label.characterSize=size;label.anchor=TextAnchor.MiddleCenter;label.color=new Color(.87f,.93f,1);}
|
||||
public static string BuildReview()
|
||||
{
|
||||
Check(!EditorApplication.isPlaying,"Review authoring requires Edit Mode");var previous=SceneManager.GetActiveScene();var scene=EditorSceneManager.NewScene(NewSceneSetup.EmptyScene,NewSceneMode.Additive);
|
||||
try
|
||||
{
|
||||
SceneManager.SetActiveScene(scene);var root=new GameObject("GreatHornStudioComparison");root.transform.position=new Vector3(300,0,0);
|
||||
var names=new[]{"Static","Idle","Walk","Attack"};
|
||||
for(int row=0;row<2;row++)
|
||||
{
|
||||
string folder=row==0?Original:Trial,actor=row==0?"GreatHorn":"GreatHornStudio";
|
||||
for(int col=0;col<4;col++)
|
||||
{
|
||||
var asset=AssetDatabase.LoadAssetAtPath<GameObject>(folder+"/"+actor+(col==0?".prefab":"_Enemy.prefab"));var go=(GameObject)PrefabUtility.InstantiatePrefab(asset,scene);go.name=(row==0?"Original_":"Studio_")+names[col];go.transform.SetParent(root.transform,false);go.transform.localPosition=new Vector3((col-1.5f)*1.8f,0,row==0?1.3f:-1.3f);
|
||||
var anim=go.GetComponentInChildren<Animator>();if(anim!=null){anim.enabled=false;Clip(names[col]).SampleAnimation(anim.gameObject,Clip(names[col]).length*(col==1?.5f:col==2?.25f:.45f));}
|
||||
Label(go.transform,(row==0?"Original":"Studio")+" / "+names[col],new Vector3(0,-.22f,-.1f),.025f);
|
||||
if(anim!=null)
|
||||
{
|
||||
anim.enabled=true;var cycle=go.AddComponent<CharacterReviewAnimCycle>();cycle.enabled=false;var so=new SerializedObject(cycle);so.FindProperty("fixedMotion").intValue=col-1;so.ApplyModifiedPropertiesWithoutUndo();cycle.enabled=true;
|
||||
}
|
||||
}
|
||||
}
|
||||
var floor=GameObject.CreatePrimitive(PrimitiveType.Plane);floor.name="Ground_Y0";floor.transform.SetParent(root.transform,false);floor.transform.localPosition=new Vector3(0,-.002f,0);floor.transform.localScale=new Vector3(.85f,1,.55f);floor.GetComponent<Renderer>().sharedMaterial=AssetDatabase.LoadAssetAtPath<Material>("Assets/Bundles/Scenes/Review/EnemyReviewFloor.mat");Object.DestroyImmediate(floor.GetComponent<Collider>());
|
||||
var camera=new GameObject("GreatHornStudioCamera").AddComponent<Camera>();camera.transform.SetParent(root.transform,false);camera.transform.localPosition=new Vector3(0,7,-10);camera.transform.LookAt(root.transform.position+new Vector3(0,.45f,0));camera.orthographic=true;camera.orthographicSize=2.05f;camera.aspect=2;camera.nearClipPlane=.1f;camera.farClipPlane=100;camera.cullingMask=1<<27;camera.backgroundColor=new Color(.075f,.105f,.14f);camera.clearFlags=CameraClearFlags.SolidColor;camera.depth=85;
|
||||
var light=new GameObject("StudioReviewLight").AddComponent<Light>();light.transform.SetParent(root.transform,false);light.type=LightType.Directional;light.transform.rotation=Quaternion.Euler(40,-35,0);light.intensity=1.1f;light.cullingMask=1<<27;
|
||||
foreach(var t in root.GetComponentsInChildren<Transform>(true))t.gameObject.layer=27;
|
||||
EditorSceneManager.SaveScene(scene,ScenePath);
|
||||
}
|
||||
finally{SceneManager.SetActiveScene(previous);EditorSceneManager.CloseScene(scene,true);}
|
||||
return ScenePath;
|
||||
}
|
||||
public static string Diagnose()
|
||||
{
|
||||
var scene=EditorSceneManager.NewPreviewScene();var rows=new List<object>();
|
||||
try
|
||||
{
|
||||
foreach(string folder in new[]{Original,Trial})
|
||||
{
|
||||
string actor=folder==Original?"GreatHorn":"GreatHornStudio";var go=(GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(folder+"/"+actor+"_Enemy.prefab"),scene);var anim=go.GetComponentInChildren<Animator>();anim.enabled=false;
|
||||
foreach(string name in new[]{"Idle","Walk","Attack"})
|
||||
{
|
||||
var clip=Clip(name);float minY=float.MaxValue,maxY=float.MinValue;int minFrame=0,minVertex=0;Vector3 minimum=Vector3.zero;
|
||||
for(int f=0;f<=120;f++){clip.SampleAnimation(anim.gameObject,clip.length*f/120);var points=Vertices(go);int index=Enumerable.Range(0,points.Length).OrderBy(i=>points[i].y).First();if(points[index].y<minY){minY=points[index].y;minFrame=f;minVertex=index;minimum=points[index];}maxY=Mathf.Max(maxY,points[index].y);}
|
||||
var skin=go.GetComponentInChildren<SkinnedMeshRenderer>();var w=skin.sharedMesh.boneWeights[minVertex];
|
||||
rows.Add(new{actor,name,minY,maxY,minFrame,minVertex,point=new[]{minimum.x,minimum.y,minimum.z},weights=new[]{new{bone=skin.bones[w.boneIndex0].name,value=w.weight0},new{bone=skin.bones[w.boneIndex1].name,value=w.weight1},new{bone=skin.bones[w.boneIndex2].name,value=w.weight2},new{bone=skin.bones[w.boneIndex3].name,value=w.weight3}}});
|
||||
}
|
||||
Object.DestroyImmediate(go);
|
||||
}
|
||||
Write("ground_diagnostics.json",rows);return JsonConvert.SerializeObject(rows,Formatting.Indented);
|
||||
}
|
||||
finally{EditorSceneManager.ClosePreviewScene(scene);}
|
||||
}
|
||||
public static string ExportFootConstraints()
|
||||
{
|
||||
var scene=EditorSceneManager.NewPreviewScene();
|
||||
try
|
||||
{
|
||||
var go=(GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(Trial+"/GreatHornStudio_Enemy.prefab"),scene);var anim=go.GetComponentInChildren<Animator>();anim.enabled=false;var skin=go.GetComponentInChildren<SkinnedMeshRenderer>();var mesh=skin.sharedMesh;var bind=Vertices(go);var bounds=Bounds(bind);var weights=mesh.boneWeights;
|
||||
var meshVertices=mesh.vertices;var indices=Enumerable.Range(0,bind.Length).Where(i=>bind[i].y<.112f).ToArray();var sets=new List<int[]>();var original=new List<float[]>();
|
||||
foreach(int i in indices)
|
||||
{
|
||||
var w=weights[i];var pairs=new[]{(w.boneIndex0,w.weight0),(w.boneIndex1,w.weight1),(w.boneIndex2,w.weight2),(w.boneIndex3,w.weight3)};float left=pairs.Where(p=>new[]{"bone_18","bone_19","bone_20","bone_21"}.Contains(skin.bones[p.Item1].name)).Sum(p=>p.Item2);int start=left>.5f?18:14;
|
||||
var bones=Enumerable.Range(start,4).Select(n=>Array.FindIndex(skin.bones,b=>b.name=="bone_"+n)).ToArray();sets.Add(bones);original.Add(bones.Select(b=>pairs.Where(p=>p.Item1==b).Sum(p=>p.Item2)).ToArray());
|
||||
}
|
||||
var frames=new List<float[][]>();
|
||||
foreach(string name in new[]{"Idle","Walk","Attack"})for(int f=0;f<=120;f++)
|
||||
{
|
||||
var clip=Clip(name);clip.SampleAnimation(anim.gameObject,clip.length*f/120);var matrices=skin.bones.Select((b,i)=>b.localToWorldMatrix*mesh.bindposes[i]).ToArray();
|
||||
frames.Add(indices.Select((v,j)=>sets[j].Select(b=>matrices[b].MultiplyPoint3x4(meshVertices[v]).y).ToArray()).ToArray());
|
||||
}
|
||||
Write("foot_constraints.json",new{modelScale=anim.transform.localScale.x,vertices=indices.Select((v,j)=>new{index=v,normalizedBind=new[]{(bind[v].x-bounds.center.x)/bounds.size.y,(bind[v].y-bounds.min.y)/bounds.size.y,(bind[v].z-bounds.center.z)/bounds.size.y},bones=sets[j].Select(b=>skin.bones[b].name).ToArray(),weights=original[j]}).ToArray(),frames});return "Exported "+indices.Length+" sole/foot vertices x 363 original action frames";
|
||||
}
|
||||
finally{EditorSceneManager.ClosePreviewScene(scene);}
|
||||
}
|
||||
public static async Task<string> Capture()
|
||||
{
|
||||
Check(!EditorApplication.isPlaying,"Capture in Edit Mode");var scene=EditorSceneManager.OpenScene(ScenePath,OpenSceneMode.Additive);var root=scene.GetRootGameObjects().Single();var camera=root.GetComponentInChildren<Camera>();var rt=new RenderTexture(1800,900,24);var tex=new Texture2D(1800,900,TextureFormat.RGB24,false);var old=RenderTexture.active;
|
||||
try
|
||||
{
|
||||
camera.enabled=false;
|
||||
foreach(var cycle in root.GetComponentsInChildren<CharacterReviewAnimCycle>())cycle.enabled=false;
|
||||
foreach(var anim in root.GetComponentsInChildren<Animator>()){anim.enabled=false;string name=anim.transform.parent.name.Split('_').Last();var clip=Clip(name);clip.SampleAnimation(anim.gameObject,clip.length*(name=="Idle"?.5f:name=="Walk"?.25f:.45f));}
|
||||
await Task.Delay(100);camera.targetTexture=rt;camera.Render();RenderTexture.active=rt;tex.ReadPixels(new Rect(0,0,1800,900),0,0);tex.Apply();string asset="Assets/Screenshots/greathorn_studio_comparison.png";File.WriteAllBytes(Path.Combine(Application.dataPath,"../",asset),tex.EncodeToPNG());AssetDatabase.ImportAsset(asset);return asset;
|
||||
}
|
||||
finally{RenderTexture.active=old;camera.targetTexture=null;rt.Release();Object.DestroyImmediate(rt);Object.DestroyImmediate(tex);EditorSceneManager.CloseScene(scene,true);}
|
||||
}
|
||||
public static async Task<string> Play()
|
||||
{
|
||||
Check(EditorApplication.isPlaying,"Enter Play Mode first");var go=Object.Instantiate(AssetDatabase.LoadAssetAtPath<GameObject>(Trial+"/GreatHornStudio_Enemy.prefab"));var anim=go.GetComponentInChildren<Animator>();go.transform.position=new Vector3(300,0,0);var root=go.GetComponentsInChildren<Transform>().Single(t=>t.name=="bone_0");var seen=new HashSet<string>();float maxTilt=0;
|
||||
try
|
||||
{
|
||||
for(int phase=0;phase<3;phase++)
|
||||
{
|
||||
anim.SetInteger("Motion",phase==1?1:0);if(phase==2)anim.SetTrigger("Attack");var until=DateTime.UtcNow.AddSeconds(2);
|
||||
while(DateTime.UtcNow<until){var s=anim.GetCurrentAnimatorStateInfo(0);foreach(var name in new[]{"Idle","Walk","Attack"})if(s.IsName(name))seen.Add(name);maxTilt=Mathf.Max(maxTilt,Vector3.Angle(root.up,Vector3.up));Check(Vector3.Distance(go.transform.position,new Vector3(300,0,0))<.001f,"Root drift");await Task.Delay(50);}
|
||||
}
|
||||
Check(seen.Count==3&&maxTilt<25,"Live animation missing/wrong orientation");Write("play_verification.json",new{status="pass",seen,maxTilt,originalController=AssetDatabase.GetAssetPath(anim.runtimeAnimatorController),rootPinned=true});return "PASS Play: original Idle/Walk/Attack on Studio mesh; maxTilt="+maxTilt;
|
||||
}
|
||||
finally{Object.Destroy(go);}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
using UnityEditor;
|
||||
using UnityEditor.SceneManagement;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using Object=UnityEngine.Object;
|
||||
|
||||
/// <summary>
|
||||
/// Studio low-poly candidate for any character (generalized from GreatHornStudioTrial): binds the Studio mesh to the
|
||||
/// ORIGINAL avatar, controller and finished clips. No animation regeneration. Every entry takes
|
||||
/// (actor, kind, originalPrefabFile, height); the candidate lives at Characters/{kind}/{actor}Studio.
|
||||
/// </summary>
|
||||
public static class StudioTrial
|
||||
{
|
||||
sealed class Ctx
|
||||
{
|
||||
public string Actor, Kind, Prefab; public float Height;
|
||||
public string Original=>"Assets/Bundles/Characters/"+Kind+"/"+Actor;
|
||||
public string Trial=>"Assets/Bundles/Characters/"+Kind+"/"+Actor+"Studio";
|
||||
public string Name=>Actor+"Studio";
|
||||
public string Animated=>Trial+"/"+Name+"_"+(Kind=="Enemy"?"Enemy":"Companion")+".prefab";
|
||||
public string Scene=>"Assets/Bundles/Scenes/Review/Studio_"+Actor+"_Review.unity";
|
||||
public string Out=>Path.Combine(Repo,"Tools/output/studio_trial",Actor);
|
||||
}
|
||||
static Ctx C(string actor,string kind,string prefab,float height)=>new Ctx{Actor=actor,Kind=kind,Prefab=prefab,Height=height};
|
||||
static string Repo=>Path.GetFullPath(Path.Combine(Application.dataPath,"../.."));
|
||||
static void Check(bool value,string message){if(!value)throw new Exception(message);}
|
||||
static void Write(Ctx c,string name,object data){Directory.CreateDirectory(c.Out);File.WriteAllText(Path.Combine(c.Out,name),JsonConvert.SerializeObject(data,Formatting.Indented));}
|
||||
static Vector3[] Vertices(GameObject go)
|
||||
{
|
||||
return go.GetComponentsInChildren<SkinnedMeshRenderer>().SelectMany(s=>{
|
||||
var m=s.sharedMesh;var weights=m.boneWeights;var binds=m.bindposes;var matrices=s.bones.Select((b,i)=>b.localToWorldMatrix*binds[i]).ToArray();
|
||||
return m.vertices.Select((v,i)=>{var w=weights[i];return matrices[w.boneIndex0].MultiplyPoint3x4(v)*w.weight0+matrices[w.boneIndex1].MultiplyPoint3x4(v)*w.weight1+matrices[w.boneIndex2].MultiplyPoint3x4(v)*w.weight2+matrices[w.boneIndex3].MultiplyPoint3x4(v)*w.weight3;}).ToArray();
|
||||
}).ToArray();
|
||||
}
|
||||
static Bounds Bounds(Vector3[] points){var b=new Bounds(points[0],Vector3.zero);foreach(var p in points)b.Encapsulate(p);return b;}
|
||||
static AnimationClip Clip(Ctx c,string name)=>AssetDatabase.LoadAssetAtPath<AnimationClip>(c.Original+"/Clips/"+name+".anim");
|
||||
static Animator Reference(Ctx c)=>AssetDatabase.LoadAssetAtPath<GameObject>(c.Original+"/"+c.Prefab).GetComponentInChildren<Animator>();
|
||||
|
||||
public static string Build(string actor,string kind,string prefab,float height)=>BuildCore(C(actor,kind,prefab,height),true);
|
||||
public static string Prepare(string actor,string kind,string prefab,float height)=>BuildCore(C(actor,kind,prefab,height),false);
|
||||
static string BuildCore(Ctx c,bool verify)
|
||||
{
|
||||
Check(!EditorApplication.isPlaying,"Author trial in Edit Mode");
|
||||
string fbx=c.Trial+"/Rigged/"+c.Name+"_Rigged.fbx";
|
||||
AssetDatabase.ImportAsset(fbx,ImportAssetOptions.ForceUpdate);
|
||||
var imp=(ModelImporter)AssetImporter.GetAtPath(fbx);imp.animationType=ModelImporterAnimationType.Generic;imp.avatarSetup=ModelImporterAvatarSetup.CreateFromThisModel;imp.importAnimation=false;imp.globalScale=1;imp.useFileScale=false;imp.bakeAxisConversion=true;imp.materialImportMode=ModelImporterMaterialImportMode.None;imp.meshCompression=ModelImporterMeshCompression.Off;imp.SaveAndReimport();
|
||||
var reference=Reference(c);
|
||||
var scene=EditorSceneManager.NewPreviewScene();
|
||||
try
|
||||
{
|
||||
var root=new GameObject(Path.GetFileNameWithoutExtension(c.Animated));SceneManager.MoveGameObjectToScene(root,scene);
|
||||
var model=(GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(fbx),scene);model.transform.SetParent(root.transform,false);model.name="Model";
|
||||
model.transform.localPosition=reference.transform.localPosition;model.transform.localRotation=reference.transform.localRotation;model.transform.localScale=reference.transform.localScale;
|
||||
var anim=model.GetComponent<Animator>();if(anim==null)anim=model.AddComponent<Animator>();anim.avatar=reference.avatar;anim.runtimeAnimatorController=reference.runtimeAnimatorController;anim.applyRootMotion=false;anim.cullingMode=AnimatorCullingMode.AlwaysAnimate;
|
||||
var material=AssetDatabase.LoadAssetAtPath<Material>(c.Trial+"/"+c.Name+".mat");foreach(var skin in model.GetComponentsInChildren<SkinnedMeshRenderer>()){skin.sharedMaterial=material;skin.updateWhenOffscreen=true;}
|
||||
var expected=reference.GetComponentsInChildren<Transform>().Where(t=>t.name.StartsWith("bone_")).ToDictionary(t=>AnimationUtility.CalculateTransformPath(t,reference.transform));
|
||||
var actual=model.GetComponentsInChildren<Transform>().Where(t=>t.name.StartsWith("bone_")).ToDictionary(t=>AnimationUtility.CalculateTransformPath(t,model.transform));
|
||||
Check(expected.Count>0&&expected.Keys.OrderBy(x=>x).SequenceEqual(actual.Keys.OrderBy(x=>x)),"Original skeleton paths changed ("+expected.Count+" vs "+actual.Count+")");
|
||||
foreach(var entry in expected){var t=actual[entry.Key];Check(Vector3.Distance(t.localPosition,entry.Value.localPosition)<.0001f&&Quaternion.Angle(t.localRotation,entry.Value.localRotation)<.01f&&Vector3.Distance(t.localScale,entry.Value.localScale)<.0001f,"Bind transform changed "+entry.Key);}
|
||||
PrefabUtility.SaveAsPrefabAsset(root,c.Animated);
|
||||
}
|
||||
finally{EditorSceneManager.ClosePreviewScene(scene);}
|
||||
AssetDatabase.SaveAssets();return verify?Verify(c):"Prepared original skeleton/controller candidate; sole constraints pending";
|
||||
}
|
||||
public static string Verify(string actor,string kind,string prefab,float height)=>Verify(C(actor,kind,prefab,height));
|
||||
static string Verify(Ctx c)
|
||||
{
|
||||
var scene=EditorSceneManager.NewPreviewScene();
|
||||
try
|
||||
{
|
||||
var go=(GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(c.Animated),scene);var anim=go.GetComponentInChildren<Animator>();anim.enabled=false;
|
||||
var reference=Reference(c);Check(anim.runtimeAnimatorController==reference.runtimeAnimatorController&&anim.avatar==reference.avatar,"Expected exact original controller/avatar");
|
||||
int boneCount=reference.GetComponentsInChildren<Transform>().Count(t=>t.name.StartsWith("bone_"));
|
||||
var bind=Vertices(go);var bounds=Bounds(bind);int triangles=go.GetComponentsInChildren<SkinnedMeshRenderer>().Sum(s=>s.sharedMesh.triangles.Length/3);int target=(int?)Newtonsoft.Json.Linq.JObject.Parse(File.ReadAllText(Path.Combine(c.Out,"trial.json")))["targetTriangles"]??2000;Check(triangles<=target*1.3f,"Studio target tolerance exceeded");Check(Mathf.Abs(bounds.size.y-c.Height)<.003f&&Mathf.Abs(bounds.min.y)<.003f,"Bind ground/height changed "+bounds);
|
||||
var staticGo=(GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(c.Trial+"/"+c.Name+".prefab"),scene);var staticPoints=staticGo.GetComponentsInChildren<MeshFilter>().SelectMany(m=>m.sharedMesh.vertices.Select(v=>m.transform.TransformPoint(v))).ToArray();float bindError=bind.Max(v=>staticPoints.Min(p=>Vector3.Distance(v,p)));Check(bindError<.002f,"Weight transfer changed static geometry "+bindError);
|
||||
Check(go.GetComponentsInChildren<SkinnedMeshRenderer>().All(s=>s.sharedMesh.boneWeights.All(w=>Mathf.Abs(w.weight0+w.weight1+w.weight2+w.weight3-1)<.001f)),"Invalid weights");
|
||||
var rows=new List<object>();var root=go.GetComponentsInChildren<Transform>().Single(t=>t.name=="bone_0");
|
||||
foreach(string name in new[]{"Idle","Walk","Attack"})
|
||||
{
|
||||
var clip=Clip(c,name);Check(anim.runtimeAnimatorController.animationClips.Contains(clip),"Not original clip "+name);
|
||||
foreach(var binding in AnimationUtility.GetCurveBindings(clip))Check(string.IsNullOrEmpty(binding.path)||anim.transform.Find(binding.path)!=null,"Unbound original curve "+binding.path);
|
||||
Vector3[] start=null,end=null;float minY=float.MaxValue,maxY=float.MinValue,movement=0,tilt=0;Vector3 rootStart=Vector3.zero;float drift=0;
|
||||
for(int frame=0;frame<=120;frame++){clip.SampleAnimation(anim.gameObject,clip.length*frame/120);var points=Vertices(go);Check(points.All(p=>!float.IsNaN(p.x)&&!float.IsInfinity(p.x)),"Invalid mesh");var b=Bounds(points);if(frame==0){start=points;rootStart=root.position;}if(frame==120)end=points;minY=Mathf.Min(minY,b.min.y);maxY=Mathf.Max(maxY,b.min.y);movement=Mathf.Max(movement,points.Select((p,i)=>Vector3.Distance(p,start[i])).Max());tilt=Mathf.Max(tilt,Vector3.Angle(root.up,Vector3.up));drift=Mathf.Max(drift,Vector2.Distance(new Vector2(root.position.x,root.position.z),new Vector2(rootStart.x,rootStart.z)));Check(b.size.y>c.Height*.8f,"Collapsed mesh "+name);}
|
||||
float seam=start.Select((p,i)=>Vector3.Distance(p,end[i])).Max();Check(minY>=-.003f&&maxY<=.003f,"Ground contact failed "+name+" "+minY+".."+maxY);Check(tilt<25&&seam<.001f,"Orientation/seam failed "+name);Check(movement>.0002f,"Motion invisible "+name);
|
||||
rows.Add(new{name,originalClip=AssetDatabase.GetAssetPath(clip),frames=121,minY,maxY,movement,tilt,drift,seam});
|
||||
}
|
||||
Write(c,"unity_verification.json",new{status="pass",triangles,bones=boneCount,bindError,bindHeight=bounds.size.y,originalAvatar=true,originalController=true,originalClips=true,rows});
|
||||
return "PASS original "+boneCount+"-bone bind, exact original avatar/controller/3 clips, "+triangles+" tris, bindError="+bindError.ToString("F5")+", 121-frame motion samples";
|
||||
}
|
||||
finally{EditorSceneManager.ClosePreviewScene(scene);}
|
||||
}
|
||||
/// <summary>Sole/foot vertices with their own four bone influences, sampled over the 363 original action frames.</summary>
|
||||
public static string ExportFootConstraints(string actor,string kind,string prefab,float height)
|
||||
{
|
||||
var c=C(actor,kind,prefab,height);var scene=EditorSceneManager.NewPreviewScene();
|
||||
try
|
||||
{
|
||||
var go=(GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(c.Animated),scene);var anim=go.GetComponentInChildren<Animator>();anim.enabled=false;var skin=go.GetComponentInChildren<SkinnedMeshRenderer>();var mesh=skin.sharedMesh;var bind=Vertices(go);var bounds=Bounds(bind);var weights=mesh.boneWeights;
|
||||
var meshVertices=mesh.vertices;var indices=Enumerable.Range(0,bind.Length).Where(i=>bind[i].y<c.Height*.14f).ToArray();
|
||||
var sets=indices.Select(i=>{var w=weights[i];return new[]{w.boneIndex0,w.boneIndex1,w.boneIndex2,w.boneIndex3};}).ToArray();
|
||||
var own=indices.Select(i=>{var w=weights[i];return new[]{w.weight0,w.weight1,w.weight2,w.weight3};}).ToArray();
|
||||
var frames=new List<float[][]>();
|
||||
foreach(string name in new[]{"Idle","Walk","Attack"})for(int f=0;f<=120;f++)
|
||||
{
|
||||
var clip=Clip(c,name);clip.SampleAnimation(anim.gameObject,clip.length*f/120);var matrices=skin.bones.Select((b,i)=>b.localToWorldMatrix*mesh.bindposes[i]).ToArray();
|
||||
frames.Add(indices.Select((v,j)=>sets[j].Select(b=>matrices[b].MultiplyPoint3x4(meshVertices[v]).y).ToArray()).ToArray());
|
||||
}
|
||||
Write(c,"foot_constraints.json",new{modelScale=anim.transform.localScale.x,vertices=indices.Select((v,j)=>new{index=v,normalizedBind=new[]{(bind[v].x-bounds.center.x)/bounds.size.y,(bind[v].y-bounds.min.y)/bounds.size.y,(bind[v].z-bounds.center.z)/bounds.size.y},bones=sets[j].Select(b=>skin.bones[b].name).ToArray(),weights=own[j]}).ToArray(),frames});
|
||||
return "Exported "+indices.Length+" sole/foot vertices x 363 original action frames";
|
||||
}
|
||||
finally{EditorSceneManager.ClosePreviewScene(scene);}
|
||||
}
|
||||
static void Label(Transform parent,string text,Vector3 position,float size)
|
||||
{var label=new GameObject("Label_"+text).AddComponent<TextMesh>();label.transform.SetParent(parent,false);label.transform.localPosition=position;label.transform.localRotation=Quaternion.Euler(12,0,0);label.text=text;label.fontSize=60;label.characterSize=size;label.anchor=TextAnchor.MiddleCenter;label.color=new Color(.87f,.93f,1);}
|
||||
/// <summary>Two-row comparison (original above, Studio below): Static / Idle / Walk / Attack.</summary>
|
||||
public static string BuildReview(string actor,string kind,string prefab,float height)
|
||||
{
|
||||
var c=C(actor,kind,prefab,height);
|
||||
Check(!EditorApplication.isPlaying,"Review authoring requires Edit Mode");var previous=SceneManager.GetActiveScene();var scene=EditorSceneManager.NewScene(NewSceneSetup.EmptyScene,NewSceneMode.Additive);
|
||||
// GreatHorn used 1.8m columns at 0.8m height; keep that ratio so the ortho camera frames all four.
|
||||
float spacing=c.Height*2.25f;
|
||||
try
|
||||
{
|
||||
SceneManager.SetActiveScene(scene);var root=new GameObject(c.Name+"Comparison");root.transform.position=new Vector3(320,0,0);
|
||||
var names=new[]{"Static","Idle","Walk","Attack"};
|
||||
for(int row=0;row<2;row++)
|
||||
{
|
||||
string folder=row==0?c.Original:c.Trial,actor0=row==0?c.Actor:c.Name;
|
||||
for(int col=0;col<4;col++)
|
||||
{
|
||||
string path=col==0?folder+"/"+actor0+".prefab":(row==0?c.Original+"/"+c.Prefab:c.Animated);
|
||||
var go=(GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(path),scene);go.name=(row==0?"Original_":"Studio_")+names[col];go.transform.SetParent(root.transform,false);go.transform.localPosition=new Vector3((col-1.5f)*spacing,0,row==0?spacing*.75f:-spacing*.75f);
|
||||
var anim=go.GetComponentInChildren<Animator>();if(anim!=null){anim.enabled=false;Clip(c,names[col]).SampleAnimation(anim.gameObject,Clip(c,names[col]).length*(col==1?.5f:col==2?.25f:.45f));}
|
||||
Label(go.transform,(row==0?"Original":"Studio")+" / "+names[col],new Vector3(0,-.22f*c.Height/.8f,-.1f),.025f*c.Height/.8f);
|
||||
}
|
||||
}
|
||||
var floor=GameObject.CreatePrimitive(PrimitiveType.Plane);floor.name="Ground_Y0";floor.transform.SetParent(root.transform,false);floor.transform.localPosition=new Vector3(0,-.002f,0);floor.transform.localScale=new Vector3(spacing*.5f,1,spacing*.32f);floor.GetComponent<Renderer>().sharedMaterial=AssetDatabase.LoadAssetAtPath<Material>("Assets/Bundles/Scenes/Review/EnemyReviewFloor.mat");Object.DestroyImmediate(floor.GetComponent<Collider>());
|
||||
var camera=new GameObject(c.Name+"Camera").AddComponent<Camera>();camera.transform.SetParent(root.transform,false);camera.transform.localPosition=new Vector3(0,7*c.Height/.8f,-10*c.Height/.8f);camera.transform.LookAt(root.transform.position+new Vector3(0,c.Height*.56f,0));camera.orthographic=true;camera.orthographicSize=2.05f*c.Height/.8f;camera.aspect=2;camera.nearClipPlane=.1f;camera.farClipPlane=100;camera.cullingMask=1<<27;camera.backgroundColor=new Color(.075f,.105f,.14f);camera.clearFlags=CameraClearFlags.SolidColor;camera.depth=85;camera.enabled=false;
|
||||
var light=new GameObject("StudioReviewLight").AddComponent<Light>();light.transform.SetParent(root.transform,false);light.type=LightType.Directional;light.transform.rotation=Quaternion.Euler(40,-35,0);light.intensity=1.1f;light.cullingMask=1<<27;
|
||||
foreach(var t in root.GetComponentsInChildren<Transform>(true))t.gameObject.layer=27;
|
||||
EditorSceneManager.SaveScene(scene,c.Scene);
|
||||
}
|
||||
finally{SceneManager.SetActiveScene(previous);EditorSceneManager.CloseScene(scene,true);}
|
||||
return c.Scene;
|
||||
}
|
||||
public static async Task<string> Capture(string actor,string kind,string prefab,float height)
|
||||
{
|
||||
var c=C(actor,kind,prefab,height);
|
||||
Check(!EditorApplication.isPlaying,"Capture in Edit Mode");var scene=EditorSceneManager.OpenScene(c.Scene,OpenSceneMode.Additive);var root=scene.GetRootGameObjects().Single();var camera=root.GetComponentInChildren<Camera>();var rt=new RenderTexture(1800,900,24);var tex=new Texture2D(1800,900,TextureFormat.RGB24,false);var old=RenderTexture.active;
|
||||
try
|
||||
{
|
||||
foreach(var anim in root.GetComponentsInChildren<Animator>()){anim.enabled=false;string name=anim.transform.parent.name.Split('_').Last();var clip=Clip(c,name);clip.SampleAnimation(anim.gameObject,clip.length*(name=="Idle"?.5f:name=="Walk"?.25f:.45f));}
|
||||
await Task.Delay(100);camera.targetTexture=rt;camera.Render();RenderTexture.active=rt;tex.ReadPixels(new Rect(0,0,1800,900),0,0);tex.Apply();string asset="Assets/Screenshots/"+c.Actor.ToLowerInvariant()+"_studio_comparison.png";File.WriteAllBytes(Path.Combine(Application.dataPath,"../",asset),tex.EncodeToPNG());AssetDatabase.ImportAsset(asset);return asset;
|
||||
}
|
||||
finally{RenderTexture.active=old;camera.targetTexture=null;rt.Release();Object.DestroyImmediate(rt);Object.DestroyImmediate(tex);EditorSceneManager.CloseScene(scene,true);}
|
||||
}
|
||||
public static async Task<string> Play(string actor,string kind,string prefab,float height)
|
||||
{
|
||||
var c=C(actor,kind,prefab,height);
|
||||
Check(EditorApplication.isPlaying,"Enter Play Mode first");var go=Object.Instantiate(AssetDatabase.LoadAssetAtPath<GameObject>(c.Animated));var anim=go.GetComponentInChildren<Animator>();go.transform.position=new Vector3(320,0,0);var root=go.GetComponentsInChildren<Transform>().Single(t=>t.name=="bone_0");var seen=new HashSet<string>();float maxTilt=0;
|
||||
try
|
||||
{
|
||||
for(int phase=0;phase<3;phase++)
|
||||
{
|
||||
anim.SetInteger("Motion",phase==1?1:0);if(phase==2)anim.SetTrigger("Attack");var until=DateTime.UtcNow.AddSeconds(2);
|
||||
while(DateTime.UtcNow<until){var s=anim.GetCurrentAnimatorStateInfo(0);foreach(var name in new[]{"Idle","Walk","Attack"})if(s.IsName(name))seen.Add(name);maxTilt=Mathf.Max(maxTilt,Vector3.Angle(root.up,Vector3.up));Check(Vector3.Distance(go.transform.position,new Vector3(320,0,0))<.001f,"Root drift");await Task.Delay(50);}
|
||||
}
|
||||
Check(seen.Count==3&&maxTilt<25,"Live animation missing/wrong orientation");Write(c,"play_verification.json",new{status="pass",seen,maxTilt,originalController=AssetDatabase.GetAssetPath(anim.runtimeAnimatorController),rootPinned=true});return "PASS Play: original Idle/Walk/Attack on Studio mesh; maxTilt="+maxTilt;
|
||||
}
|
||||
finally{Object.Destroy(go);}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,131 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using HotUpdate.Gameplay;
|
||||
using HotUpdate.Net;
|
||||
using HotUpdate.UI;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityEngine.UI;
|
||||
|
||||
/// <summary>Real UI/HTTP on an isolated database. Supports restarting the test server between two entries.</summary>
|
||||
public static class VerifyBattleRuntime
|
||||
{
|
||||
const string Endpoint="http://127.0.0.1:18083";
|
||||
static string Repo=>Path.GetFullPath(Path.Combine(Application.dataPath,"../.."));
|
||||
static PrototypeFlow Flow=>UnityEngine.Object.FindObjectOfType<PrototypeFlow>();
|
||||
static T Get<T>(string name)=>(T)typeof(PrototypeFlow).GetField(name,BindingFlags.Instance|BindingFlags.NonPublic).GetValue(Flow);
|
||||
static void Set(string name,object value)=>typeof(PrototypeFlow).GetField(name,BindingFlags.Instance|BindingFlags.NonPublic).SetValue(Flow,value);
|
||||
static object Call(string name)=>typeof(PrototypeFlow).GetMethod(name,BindingFlags.Instance|BindingFlags.NonPublic).Invoke(Flow,null);
|
||||
static void Check(bool v,string message){if(!v)throw new Exception(message);}
|
||||
static async Task Until(Func<bool> condition,int seconds=35){var end=DateTime.UtcNow.AddSeconds(seconds);while(!condition()){Check(DateTime.UtcNow<end,"Timed out "+Flow?.Page);await Task.Delay(50);}}
|
||||
static void Click(string name)
|
||||
{
|
||||
var button=UnityEngine.Object.FindObjectsOfType<Button>().Single(b=>b.name=="Btn_"+name&&b.gameObject.activeInHierarchy);Check(button.interactable,"Disabled "+name);Canvas.ForceUpdateCanvases();var rect=button.GetComponent<RectTransform>();
|
||||
var pointer=new PointerEventData(EventSystem.current){position=RectTransformUtility.WorldToScreenPoint(null,rect.TransformPoint(rect.rect.center)),button=PointerEventData.InputButton.Left};var hits=new List<RaycastResult>();EventSystem.current.RaycastAll(pointer,hits);
|
||||
Check(hits.Count>0&&ExecuteEvents.GetEventHandler<IPointerClickHandler>(hits[0].gameObject)==button.gameObject,"Blocked "+name);ExecuteEvents.Execute(button.gameObject,pointer,ExecuteEvents.pointerClickHandler);
|
||||
}
|
||||
static async Task ClickReady(string name){for(int n=0;;n++){try{Click(name);return;}catch(Exception)when(n<40){await Task.Delay(50);}}}
|
||||
static async Task Capture()
|
||||
{
|
||||
var type=AppDomain.CurrentDomain.GetAssemblies().Select(a=>a.GetType("Unity.Pipeline.Editor.Commands.Capture.CaptureCommands")).First(t=>t!=null);
|
||||
type.GetMethod("CaptureGameView",BindingFlags.Public|BindingFlags.Static).Invoke(null,new object[]{1080,1920,null,"Screenshots/battle_skills_network.png",false,0,"screen"});await Task.Delay(150);
|
||||
}
|
||||
public static string Assets()
|
||||
{
|
||||
var arena=AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/Scenes/Prototype/PrototypeArena.prefab");var player=arena.GetComponentInChildren<BattleSkillPresentation>(true);Check(player!=null&&player.EffectKinds==15&&player.ProfileCount==10,"Missing formal skill bank");var so=new SerializedObject(player);int count=0;
|
||||
for(int i=0;i<15;i++){var list=so.FindProperty("_effects").GetArrayElementAtIndex(i).FindPropertyRelative("instances");count+=list.arraySize;for(int n=0;n<list.arraySize;n++)Check(list.GetArrayElementAtIndex(n).objectReferenceValue!=null,"Missing particle instance");}
|
||||
Check(count==76&&so.FindProperty("_clips").arraySize==9&&so.FindProperty("_voices").arraySize==8,"Pool budget changed");Check(so.FindProperty("_petImpacts").arraySize==10&&so.FindProperty("_enemyImpacts").arraySize==5,"Missing action phase mappings");
|
||||
int anchors=0;foreach(string group in new[]{"Heroes","Enemies"})foreach(Transform actor in arena.transform.Find(group)){var point=actor.Find("SkillMuzzle");Check(point!=null&&point.localPosition.z<0,"Missing local -Z muzzle");anchors++;}Check(anchors==19,"Expected 19 authored muzzle anchors");
|
||||
foreach(string name in new[]{"battle_skills_network","battle_skills_anchors"})if(File.Exists(Path.Combine(Application.dataPath,"Screenshots/"+name+".png")))AssetDatabase.ImportAsset("Assets/Screenshots/"+name+".png",ImportAssetOptions.ForceUpdate);
|
||||
File.WriteAllText(Path.Combine(Repo,"Doc/Design/Combat/Runtime/unity_assets.json"),JsonConvert.SerializeObject(new{status="pass",effects=15,profiles=10,audioClips=9,poolInstances=count,voices=8,anchors,petPhases=10,enemyPhases=5},Formatting.Indented));return "PASS formal battle bank: 76 instances, eight voices, 19 local -Z muzzles, 15 action phase mappings";
|
||||
}
|
||||
public static string Domain()
|
||||
{
|
||||
var files=Directory.GetFiles(Path.Combine(Repo,"Tools/output/combat_runtime/traces"),"*.json");Check(files.Length==23,"Expected 20 T1 stages plus three T2 capstone fixtures");var rows=new List<object>();
|
||||
foreach(string file in files)
|
||||
{
|
||||
var data=JObject.Parse(File.ReadAllText(file));var manifest=JsonUtility.FromJson<CombatTraceManifest>(data["manifest"].ToString());var events=data["events"].ToObject<CombatEvent[]>();Check(CombatTraceValidation.Events(manifest,events),"Invalid exported trace");
|
||||
var snapshot=JsonUtility.FromJson<BattleSnapshot>(data["save"].ToString());var config=JsonUtility.FromJson<PrototypeConfig>(data["config"].ToString());var stage=JsonUtility.FromJson<StageConfig>(data["stage"].ToString());var game=new PrototypeGame(PrototypeSave.BattleSnapshot(snapshot.level,snapshot.stages,snapshot.formation));var battle=new PrototypeBattle("domain-authoritative-"+stage.id,game,config,stage.id);
|
||||
battle.LoadTrace(manifest,events);for(int i=0;i<2401&&!battle.Finished;i++){battle.Tick();while(battle.TryDequeueCue(out var _)){}while(battle.TryDequeueSkillCue(out var _)){};}
|
||||
Check(battle.TraceFinalStateMatches&&battle.TraceEventsConsumed==events.Length,"Final read model mismatch "+file);
|
||||
foreach(var stat in data["manifest"]["stats"]??new JArray()){var h=battle.Heroes.Single(x=>x.Pet==(int)stat["pet"]);Check(Mathf.Abs(h.DamageDealt-(float)stat["damage"])<.01f&&Mathf.Abs(h.Healing-(float)stat["healing"])<.01f&&Mathf.Abs(h.Absorbed-(float)stat["absorbed"])<.01f&&h.SkillCasts==(int)stat["skills"],"Read model stats mismatch");}
|
||||
var changed=events[0].seq;events[0].seq=999;Check(!CombatTraceValidation.Events(manifest,events),"Corrupt sequence accepted");events[0].seq=changed;
|
||||
rows.Add(new{stage=stage.id,events=events.Length,won=battle.Won});
|
||||
}
|
||||
string folder=Path.Combine(Repo,"Doc/Design/Combat/Runtime");Directory.CreateDirectory(folder);File.WriteAllText(Path.Combine(folder,"unity_domain.json"),JsonConvert.SerializeObject(new{status="pass",cases=files.Length,all20Stages=true,rows,corruptTraceRejected=true},Formatting.Indented));return "PASS 23 authoritative C++ traces -> C# read model: all 20 stages, three T2 capstones, exact final state/stats, corrupt sequences rejected";
|
||||
}
|
||||
public static Task<string> Visual()=>CaptureVisual(false);
|
||||
public static Task<string> VisualSkills()=>CaptureVisual(true);
|
||||
static async Task<string> CaptureVisual(bool signature)
|
||||
{
|
||||
Check(EditorApplication.isPlaying,"Use Play Mode");var data=JObject.Parse(File.ReadAllText(Path.Combine(Repo,"Tools/output/combat_runtime/traces/stage_20_t2_f0.json")));var snapshot=JsonUtility.FromJson<BattleSnapshot>(data["save"].ToString());var config=JsonUtility.FromJson<PrototypeConfig>(data["config"].ToString());var game=new PrototypeGame(PrototypeSave.BattleSnapshot(snapshot.level,snapshot.stages,snapshot.formation));var battle=new PrototypeBattle("isolated-trace-visual",game,config,20);
|
||||
battle.LoadTrace(JsonUtility.FromJson<CombatTraceManifest>(data["manifest"].ToString()),data["events"].ToObject<CombatEvent[]>());
|
||||
var arena=UnityEngine.Object.Instantiate(AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/Scenes/Prototype/PrototypeArena.prefab"));var ui=UnityEngine.Object.Instantiate(AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/UI/Prefab/UI_PrototypeBattle.prefab"));ui.name="UI_PrototypeBattle";ui.SetActive(false);
|
||||
var host=new GameObject("IsolatedAuthoritativeVisual");host.SetActive(false);var flow=host.AddComponent<PrototypeFlow>();Action<string,object> set=(n,v)=>typeof(PrototypeFlow).GetField(n,BindingFlags.Instance|BindingFlags.NonPublic).SetValue(flow,v);
|
||||
try
|
||||
{
|
||||
set("_profile",new Func<long>(()=>-1));set("_boundProfile",-1L);set("_game",game);set("_config",config);set("_battle",battle);set("_arena",arena);set("_settled",true);set("_speed",2);set("_page",Activator.CreateInstance(typeof(PrototypeFlow).GetNestedType("Panel",BindingFlags.NonPublic),new object[]{ui}));
|
||||
var heroes=Enumerable.Range(0,10).Select(i=>arena.transform.Find("Heroes/Hero"+i)).ToArray();var enemies=Enumerable.Range(0,9).Select(i=>arena.transform.Find("Enemies/Enemy"+i)).ToArray();var types=enemies.Select(s=>Enumerable.Range(0,5).Select(t=>s.Find("Type"+t)).ToArray()).ToArray();var t1=heroes.Select(h=>h.Find("Visual")).ToArray();var t2=heroes.Select(h=>h.Find("VisualT2")).ToArray();
|
||||
set("_heroViews",heroes);set("_enemyViews",enemies);set("_enemyTypes",types);set("_heroT1Visuals",t1);set("_heroT2Visuals",t2);set("_heroAnimators",t1.Select(v=>v.GetComponentInChildren<Animator>(true)).ToArray());set("_heroT2Animators",t2.Select(v=>v==null?null:v.GetComponentInChildren<Animator>(true)).ToArray());set("_heroPulse",new float[10]);set("_heroSkillPulse",new float[10]);set("_enemyAnimators",types.Select(ts=>ts.Select(t=>t.GetComponentInChildren<Animator>(true)).ToArray()).ToArray());set("_enemyModels",new PrototypeBattle.Enemy[9]);set("_enemyStrikes",new int[9]);
|
||||
foreach(var name in new[]{"_projectiles","_skillViews","_shieldViews"})set(name,Enumerable.Range(0,10).Select(i=>arena.transform.Find((name=="_projectiles"?"Projectiles/Shot":name=="_skillViews"?"SkillEffects/Skill":"SkillEffects/Shield")+i)).ToArray());
|
||||
var fx=arena.GetComponentInChildren<BattleSkillPresentation>();set("_skillFeedback",fx);set("_enemyFeedback",arena.GetComponentInChildren<EnemyCombatPresentation>());
|
||||
Check(heroes.Concat(enemies).All(t=>t.Find("SkillMuzzle")!=null),"Missing authored muzzle");host.SetActive(true);
|
||||
var end=DateTime.UtcNow.AddSeconds(18);Func<bool> ready=()=>signature?fx.GetComponentsInChildren<LineRenderer>().Any(l=>l.enabled):fx.ActiveShots>0;while(!ready()&&DateTime.UtcNow<end)await Task.Delay(10);Check(ready()&&fx.PlayedEffects>0,"No authoritative visual cue");set("_paused",true);await Task.Delay(60);
|
||||
foreach(var ps in fx.GetComponentsInChildren<ParticleSystem>().Where(ps=>ps.transform.parent.GetComponent<ParticleSystem>()==null&&(ps.isPlaying||ps.isPaused))){ps.Simulate(.03f,true,false,true);ps.Pause(true);}
|
||||
var point=(Vector3)typeof(PrototypeFlow).GetMethod("CombatPoint",BindingFlags.Instance|BindingFlags.NonPublic).Invoke(flow,new object[]{1});var muzzle=heroes[1].Find("SkillMuzzle");Check(Vector3.Distance(point,muzzle.position)<.001f,"T2 point must use authored scaled muzzle");
|
||||
var camera=arena.GetComponentInChildren<Camera>();var rt=new RenderTexture(900,1200,24);var texture=new Texture2D(900,1200,TextureFormat.RGB24,false);var previous=RenderTexture.active;
|
||||
try{camera.targetTexture=rt;camera.Render();RenderTexture.active=rt;texture.ReadPixels(new Rect(0,0,900,1200),0,0);texture.Apply();File.WriteAllBytes(Path.Combine(Repo,"AIClient/Assets/Screenshots/"+(signature?"partner_skills_battle":"battle_skills_anchors")+".png"),texture.EncodeToPNG());}
|
||||
finally{camera.targetTexture=null;RenderTexture.active=previous;rt.Release();UnityEngine.Object.Destroy(rt);UnityEngine.Object.Destroy(texture);}
|
||||
File.WriteAllText(Path.Combine(Repo,signature?"Doc/Design/Combat/PartnerSkills/battle_visual.json":"Doc/Design/Combat/Runtime/unity_anchors.json"),JsonConvert.SerializeObject(new{status="pass",authoritative=true,persistentMuzzles=19,t2ScaleApplied=true,flight=fx.ActiveShots>0,signature,effects=fx.PlayedEffects,networkAccountWrites=false},Formatting.Indented));return "PASS final T2 authored muzzles and authoritative flight; no account writes";
|
||||
}
|
||||
finally{UnityEngine.Object.Destroy(host);UnityEngine.Object.Destroy(ui);UnityEngine.Object.Destroy(arena);}
|
||||
}
|
||||
public static async Task<string> Begin(string username)
|
||||
{
|
||||
Check(EditorApplication.isPlaying,"Use Play Mode");await Until(()=>Flow?.Game!=null&&!Flow.IsBusy);
|
||||
SessionState.SetString("AIGame.Runtime.original",JsonUtility.ToJson(Flow.Game.State));SessionState.SetString("AIGame.Runtime.endpoint",Get<string>("_httpBase"));SessionState.SetBool("AIGame.Runtime.sfx",PrototypeClientPrefs.Sfx);
|
||||
AuthResponse auth=null;bool done=false;string error=null;Flow.StartCoroutine(AuthApi.Login(Endpoint,username,"isolated-formal-heroes-password",(r,e)=>{auth=r;error=e;done=true;}));await Until(()=>done);Check(auth!=null,"Isolated login "+error);
|
||||
var session=new SessionData{Pid=auth.pid,Token=auth.token,Username=username};UiManager.Instance.Get(ConfirmDialogView.PrefabName).GetComponent<ConfirmDialogView>().Hide();
|
||||
Set("_session",new Func<SessionData>(()=>session));Set("_profile",new Func<long>(()=>session.Pid));Set("_httpBase",Endpoint);Set("_boundProfile",0L);Flow.Handle("Home");await Until(()=>Flow.Game!=null&&!Flow.IsBusy&&Get<long>("_boundProfile")==session.Pid);
|
||||
await ClickReady("Adventure");await Until(()=>Flow.Page=="UI_PrototypeStages");await ClickReady("Stage5");await Until(()=>Flow.Page=="UI_PrototypeFormation");await ClickReady("StartBattle");await Until(()=>Flow.Page=="UI_PrototypeBattle"&&Flow.Battle!=null);
|
||||
Check(Flow.Battle.Authoritative,"Client fell back to local simulation");var remote=Get<PrototypeReply>("_reply").battle;Check(remote.snapshot.rulesVersion==3,"Missing rule version");SessionState.SetString("AIGame.Runtime.battle",remote.id);SessionState.SetString("AIGame.Runtime.trace",remote.trace.traceHash);
|
||||
var fx=Get<BattleSkillPresentation>("_skillFeedback");Check(fx!=null&&fx.EffectKinds==15&&fx.ProfileCount==10,"Missing authored feedback");PrototypeClientPrefs.Sfx=true;
|
||||
await Until(()=>fx.ActiveShots>0);await ClickReady("Pause");float clock=Flow.Battle.Time;await Task.Delay(350);Check(clock==Flow.Battle.Time,"Pause did not freeze data");
|
||||
PrototypeClientPrefs.Sfx=false;await Task.Delay(50);Check(fx.GetComponentsInChildren<AudioSource>().All(a=>!a.isPlaying),"Mute not applied");PrototypeClientPrefs.Sfx=true;
|
||||
await Capture();return "PASS real HTTP begin + full paged hash validation + T2 stage 5, flight/pause/mute; paused for isolated server restart";
|
||||
}
|
||||
public static async Task<string> ResumeAndFinish()
|
||||
{
|
||||
Check(EditorApplication.isPlaying&&Get<string>("_httpBase")==Endpoint,"Expected isolated battle");
|
||||
Call("Home");Flow.StartCoroutine((IEnumerator)Call("Synchronize"));await Until(()=>Flow.Battle!=null&&Flow.Page=="UI_PrototypeBattle"&&!Flow.IsBusy);
|
||||
var remote=Get<PrototypeReply>("_reply").battle;Check(remote.id==SessionState.GetString("AIGame.Runtime.battle","")&&remote.trace.traceHash==SessionState.GetString("AIGame.Runtime.trace",""),"Restart regenerated pending battle");
|
||||
Check(Flow.Battle.Authoritative,"Resume lost trace mode");await ClickReady("Speed");Check(Get<int>("_speed")==2,"2x toggle failed");
|
||||
var fx=Get<BattleSkillPresentation>("_skillFeedback");bool shot=false,shield=false,attack=false;var until=DateTime.UtcNow.AddSeconds(55);
|
||||
while(!Flow.Battle.Finished&&DateTime.UtcNow<until)
|
||||
{
|
||||
shot|=fx.ActiveShots>0;shield|=fx.ActiveShields>0;attack|=Flow.Battle.Enemies.Any(e=>e.Strikes>0);
|
||||
await Task.Delay(25);
|
||||
}
|
||||
Check(Flow.Battle.Finished&&Flow.Battle.TraceFinalStateMatches,"Client final state differs from authoritative trace");Check(shot&&shield&&attack,"Incomplete visible fight");
|
||||
await Until(()=>!Flow.IsBusy&&string.IsNullOrEmpty(Flow.Game.State.pendingBattle));var receipt=Get<PrototypeReply>("_reply").result;Check(receipt!=null&&receipt.won==Flow.Battle.Won,"Server result mismatch");
|
||||
foreach(var stat in receipt.stats){var hero=Flow.Battle.Heroes.Single(h=>h.Pet==stat.pet);Check(Mathf.Abs(hero.DamageDealt-stat.damage)<.01f&&Mathf.Abs(hero.Healing-stat.healing)<.01f&&Mathf.Abs(hero.Absorbed-stat.absorbed)<.01f&&hero.SkillCasts==stat.skills,"Stats mismatch for "+stat.pet);}
|
||||
Check(fx.ActiveShots==0&&fx.ActiveCharges==0&&fx.ActiveShields==0,"End leaked presentation leases");
|
||||
string folder=Path.Combine(Repo,"Doc/Design/Combat/Runtime");Directory.CreateDirectory(folder);File.WriteAllText(Path.Combine(folder,"unity_network.json"),JsonConvert.SerializeObject(new{status="pass",endpoint=Endpoint,stage=5,tier=2,authoritative=true,hashVerified=true,serverRestartRecovery=true,pause=true,mute=true,speed2=true,flight=shot,shield,enemyAttack=attack,finalStateExact=true,statsMatch=true,events=Flow.Battle.TraceEventsConsumed,won=receipt.won,sounds=fx.PlayedSounds,cleanup=true,realAccountWrites=false},Formatting.Indented));
|
||||
return "PASS real paged HTTP battle after server restart: T2 stage 5, 2x, exact state/stats and server reward; screenshot battle_skills_network.png";
|
||||
}
|
||||
public static async Task<string> Cleanup()
|
||||
{
|
||||
PrototypeClientPrefs.Sfx=SessionState.GetBool("AIGame.Runtime.sfx",true);var net=UnityEngine.Object.FindObjectOfType<GameNet>();UiManager.Instance.Get(ConfirmDialogView.PrefabName).GetComponent<ConfirmDialogView>().Hide();
|
||||
Set("_session",new Func<SessionData>(()=>net.Session));Set("_profile",new Func<long>(()=>net.Session?.Pid??0));Set("_httpBase",SessionState.GetString("AIGame.Runtime.endpoint","http://127.0.0.1:8080"));Set("_boundProfile",0L);Flow.Handle("Home");await Until(()=>Flow.Game!=null&&!Flow.IsBusy&&Get<string>("_httpBase")!=Endpoint);
|
||||
var original=JsonUtility.FromJson<PrototypeSave>(SessionState.GetString("AIGame.Runtime.original",""));var actual=Flow.Game.State;Check(actual.coins==original.coins&&actual.candy==original.candy&&actual.level==original.level&&actual.shots==original.shots&&actual.stages.SequenceEqual(original.stages)&&actual.formation.SequenceEqual(original.formation),"Real account changed");
|
||||
return "Restored real account and preferences; wallet, level, roster, formation unchanged";
|
||||
}
|
||||
}
|
||||
@@ -114,12 +114,12 @@ public static class VerifyEnemyCombatFx
|
||||
finally{PrototypeClientPrefs.Sfx=sfx;Object.Destroy(bank);}
|
||||
}
|
||||
/// <summary>Uses the real PrototypeFlow.Update/RefreshBattle with an isolated in-memory battle. No login or reward request.</summary>
|
||||
public static async Task<string> PlayBattle()
|
||||
public static async Task<string> PlayBattle(bool studio = false)
|
||||
{
|
||||
Check(EditorApplication.isPlaying,"Enter Play Mode first");
|
||||
var battle=Battle(0);var config=battle.Config;
|
||||
config.stages[0].enemyIds=new[]{0,1,2,3,4,0,1,2,4};config.stages[0].waveGap=.5f;
|
||||
foreach(var enemy in config.enemies){enemy.hp=100;enemy.hpStep=0;enemy.speed=20;enemy.attack=1;enemy.cooldown=.5f;}
|
||||
foreach(var enemy in config.enemies){enemy.hp=studio?240:100;enemy.hpStep=0;enemy.speed=20;enemy.attack=1;enemy.cooldown=.5f;}
|
||||
config.pets[0].cooldown=.15f;battle.Heroes[0].Attack=60;
|
||||
var arena=Object.Instantiate(AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/Scenes/Prototype/PrototypeArena.prefab"));
|
||||
var ui=Object.Instantiate(AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/UI/Prefab/UI_PrototypeBattle.prefab"));ui.name="UI_PrototypeBattle";ui.SetActive(false);
|
||||
@@ -133,19 +133,30 @@ public static class VerifyEnemyCombatFx
|
||||
var heroes=Enumerable.Range(0,pets).Select(i=>arena.transform.Find("Heroes/Hero"+i)).ToArray();
|
||||
var slots=Enumerable.Range(0,9).Select(i=>arena.transform.Find("Enemies/Enemy"+i)).ToArray();
|
||||
var types=slots.Select(s=>Enumerable.Range(0,5).Select(i=>s.Find("Type"+i)).ToArray()).ToArray();
|
||||
if(studio)for(int s=0;s<slots.Length;s++)for(int t=0;t<5;t++)
|
||||
Check(types[s][t].GetComponentsInChildren<SkinnedMeshRenderer>(true).All(r=>AssetDatabase.GetAssetPath(r.sharedMesh).Contains("/"+Actors[t]+"Studio/")),"Old enemy mesh in slot "+s+" type "+t);
|
||||
set("_heroViews",heroes);set("_enemyViews",slots);set("_enemyTypes",types);
|
||||
set("_heroAnimators",heroes.Select(h=>h.GetComponentInChildren<Animator>(true)).ToArray());set("_heroPulse",new float[pets]);set("_heroSkillPulse",new float[pets]);
|
||||
var t1=heroes.Select(h=>h.Find("Visual")).ToArray();var t2=heroes.Select(h=>h.Find("VisualT2")).ToArray();
|
||||
set("_heroT1Visuals",t1);set("_heroT2Visuals",t2);
|
||||
set("_heroAnimators",t1.Select(h=>h==null?null:h.GetComponentInChildren<Animator>(true)).ToArray());
|
||||
set("_heroT2Animators",t2.Select(h=>h==null?null:h.GetComponentInChildren<Animator>(true)).ToArray());set("_heroPulse",new float[pets]);set("_heroSkillPulse",new float[pets]);
|
||||
set("_enemyAnimators",types.Select(ts=>ts.Select(t=>t.GetComponentInChildren<Animator>(true)).ToArray()).ToArray());set("_enemyModels",new PrototypeBattle.Enemy[9]);set("_enemyStrikes",new int[9]);
|
||||
foreach(var name in new[]{"_projectiles","_skillViews","_shieldViews"})set(name,Enumerable.Range(0,pets).Select(i=>arena.transform.Find((name=="_projectiles"?"Projectiles/Shot":name=="_skillViews"?"SkillEffects/Skill":"SkillEffects/Shield")+i)).ToArray());
|
||||
var feedback=arena.GetComponentInChildren<EnemyCombatPresentation>();Check(feedback!=null,"Arena feedback missing");set("_enemyFeedback",feedback);
|
||||
host.SetActive(true);int last=0;bool captured=false;var until=DateTime.UtcNow.AddSeconds(8);
|
||||
var walked=new HashSet<int>();var attacked=new HashSet<int>();
|
||||
host.SetActive(true);int last=0;bool captured=false;var until=DateTime.UtcNow.AddSeconds(10);
|
||||
while(!battle.Finished&&DateTime.UtcNow<until)
|
||||
{
|
||||
foreach(var e in battle.Enemies.Where(e=>e.Alive))
|
||||
{
|
||||
var anim=types[e.Index][e.Type].GetComponentInChildren<Animator>();var state=anim.GetCurrentAnimatorStateInfo(0);
|
||||
if(state.IsName("Walk"))walked.Add(e.Type);if(state.IsName("Attack"))attacked.Add(e.Type);
|
||||
}
|
||||
if(!captured&&battle.Enemies.Any(e=>e.Type==4&&e.Strikes>0)&&feedback.PlayedEffects>last)
|
||||
{
|
||||
captured=true;set("_paused",true);await Task.Delay(35);
|
||||
var camera=arena.GetComponentsInChildren<Camera>().First();var rt=new RenderTexture(900,1200,24);var tex=new Texture2D(900,1200,TextureFormat.RGB24,false);var previous=RenderTexture.active;
|
||||
try{camera.targetTexture=rt;camera.Render();RenderTexture.active=rt;tex.ReadPixels(new Rect(0,0,900,1200),0,0);tex.Apply();File.WriteAllBytes(Path.Combine(Repo,"AIClient/Assets/Screenshots/enemy_combat_fx_battle.png"),tex.EncodeToPNG());}
|
||||
try{camera.targetTexture=rt;camera.Render();RenderTexture.active=rt;tex.ReadPixels(new Rect(0,0,900,1200),0,0);tex.Apply();File.WriteAllBytes(Path.Combine(Repo,"AIClient/Assets/Screenshots/"+(studio?"enemy_studio_arena":"enemy_combat_fx_battle")+".png"),tex.EncodeToPNG());}
|
||||
finally{camera.targetTexture=null;RenderTexture.active=previous;rt.Release();Object.Destroy(rt);Object.Destroy(tex);}
|
||||
set("_paused",false);
|
||||
}
|
||||
@@ -153,7 +164,8 @@ public static class VerifyEnemyCombatFx
|
||||
}
|
||||
Check(captured&&feedback.PlayedEffects>0&&battle.Enemies.Select(e=>e.Type).Distinct().Count()==5,"Real flow did not play every type");
|
||||
Check(battle.Enemies.GroupBy(e=>e.Type).All(g=>g.Sum(e=>e.Strikes)>0),"Some type never attacked");
|
||||
Report("battle",new{status="pass",realFlow=true,isolatedInMemory=true,networkRewardRequests=false,allFiveTypes=true,effects=feedback.PlayedEffects,sounds=feedback.PlayedSounds,captured,battle.Defeated});
|
||||
if(studio)Check(walked.Count==5&&attacked.Count==5,"Missing Studio Walk/Attack: "+string.Join(",",walked)+" / "+string.Join(",",attacked));
|
||||
Report(studio?"studio_arena":"battle",new{status="pass",realFlow=true,isolatedInMemory=true,networkRewardRequests=false,allFiveTypes=true,studio,walked=walked.OrderBy(t=>t),attacked=attacked.OrderBy(t=>t),effects=feedback.PlayedEffects,sounds=feedback.PlayedSounds,captured,battle.Defeated});
|
||||
return "PASS real PrototypeFlow battle: all five types attack, hit cues consumed, screenshot enemy_combat_fx_battle.png; no account writes";
|
||||
}
|
||||
finally{Object.Destroy(host);Object.Destroy(ui);Object.Destroy(arena);}
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
using UnityEditor;
|
||||
using UnityEditor.SceneManagement;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
using Object=UnityEngine.Object;
|
||||
|
||||
/// <summary>One Play session exercises all four original controllers on their new Studio meshes.</summary>
|
||||
public static class VerifyEnemyStudioBatch
|
||||
{
|
||||
static readonly string[] Actors={"Hornlet","Dashlet","Shellhorn","HornCaptain"};
|
||||
static string Repo=>Path.GetFullPath(Path.Combine(Application.dataPath,"../.."));
|
||||
static void Check(bool v,string message){if(!v)throw new Exception(message);}
|
||||
public static async Task<string> PlayAll()
|
||||
{
|
||||
Check(EditorApplication.isPlaying,"Use Play Mode");
|
||||
var objects=new List<GameObject>();var animators=new List<Animator>();var bones=new List<Transform>();var seen=Actors.Select(a=>new HashSet<string>()).ToArray();var tilt=new float[4];
|
||||
try
|
||||
{
|
||||
for(int i=0;i<Actors.Length;i++)
|
||||
{
|
||||
string actor=Actors[i];var prefab=AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/Characters/Enemy/"+actor+"Studio/"+actor+"Studio_Enemy.prefab");Check(prefab!=null,"Missing "+actor);
|
||||
var go=Object.Instantiate(prefab);objects.Add(go);go.transform.position=new Vector3(400+i*3,0,0);var anim=go.GetComponentInChildren<Animator>();animators.Add(anim);bones.Add(go.GetComponentsInChildren<Transform>().Single(t=>t.name=="bone_0"));
|
||||
var original=AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/Characters/Enemy/"+actor+"/"+actor+"_Enemy.prefab").GetComponentInChildren<Animator>();Check(anim.avatar==original.avatar&&anim.runtimeAnimatorController==original.runtimeAnimatorController,"Original avatar/controller changed "+actor);
|
||||
}
|
||||
for(int phase=0;phase<3;phase++)
|
||||
{
|
||||
foreach(var anim in animators){anim.SetInteger("Motion",phase==1?1:0);if(phase==2)anim.SetTrigger("Attack");}
|
||||
var until=DateTime.UtcNow.AddSeconds(2);
|
||||
while(DateTime.UtcNow<until)
|
||||
{
|
||||
Check(EditorApplication.isPlaying,"Editor left Play during verification");
|
||||
for(int i=0;i<Actors.Length;i++){var s=animators[i].GetCurrentAnimatorStateInfo(0);foreach(string name in new[]{"Idle","Walk","Attack"})if(s.IsName(name))seen[i].Add(name);tilt[i]=Mathf.Max(tilt[i],Vector3.Angle(bones[i].up,Vector3.up));Check(Vector3.Distance(objects[i].transform.position,new Vector3(400+i*3,0,0))<.001f,"Root moved "+Actors[i]);}
|
||||
await Task.Delay(40);
|
||||
}
|
||||
}
|
||||
for(int i=0;i<Actors.Length;i++)
|
||||
{
|
||||
Check(seen[i].Count==3&&tilt[i]<25,"Missing state or bad tilt "+Actors[i]);string dir=Path.Combine(Repo,"Tools/output/studio_trial",Actors[i]);
|
||||
File.WriteAllText(Path.Combine(dir,"play_verification.json"),JsonConvert.SerializeObject(new{status="pass",seen=seen[i],maxTilt=tilt[i],originalController=AssetDatabase.GetAssetPath(animators[i].runtimeAnimatorController),originalAvatar=true,rootPinned=true,batch="four_enemies"},Formatting.Indented));
|
||||
}
|
||||
return "PASS four Studio enemies: original Avatar/controller, Idle/Walk/Attack, orientation and pinned actor roots";
|
||||
}
|
||||
finally{foreach(var go in objects)if(go!=null)Object.Destroy(go);}
|
||||
}
|
||||
public static async Task<string> Overview()
|
||||
{
|
||||
Check(!EditorApplication.isPlaying,"Build overview in Edit Mode");
|
||||
var actors=Actors.Concat(new[]{"GreatHorn"}).ToArray();var heights=new[]{.5f,.5f,.5f,.6f,.8f};
|
||||
var previous=SceneManager.GetActiveScene();var scene=EditorSceneManager.NewScene(NewSceneSetup.EmptyScene,NewSceneMode.Additive);var old=RenderTexture.active;var rt=new RenderTexture(1800,900,24);var texture=new Texture2D(1800,900,TextureFormat.RGB24,false);
|
||||
try
|
||||
{
|
||||
SceneManager.SetActiveScene(scene);var root=new GameObject("FiveEnemyStudioOverview");root.transform.position=new Vector3(440,0,0);
|
||||
for(int row=0;row<2;row++)for(int i=0;i<actors.Length;i++)
|
||||
{
|
||||
string name=actors[i]+(row==0?"":"Studio");var prefab=AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/Characters/Enemy/"+name+"/"+name+"_Enemy.prefab");Check(prefab!=null,"Missing "+name);
|
||||
var go=(GameObject)PrefabUtility.InstantiatePrefab(prefab,scene);go.transform.SetParent(root.transform,false);go.transform.localPosition=new Vector3((i-2)*1.8f,0,row==0?1.35f:-1.35f);go.transform.localScale=Vector3.one*(.8f/heights[i]);
|
||||
var animator=go.GetComponentInChildren<Animator>();animator.enabled=false;var clip=AssetDatabase.LoadAssetAtPath<AnimationClip>("Assets/Bundles/Characters/Enemy/"+actors[i]+"/Clips/Idle.anim");clip.SampleAnimation(animator.gameObject,clip.length*.5f);
|
||||
var label=new GameObject("Label_"+name).AddComponent<TextMesh>();label.transform.SetParent(root.transform,false);label.transform.localPosition=go.transform.localPosition+new Vector3(0,-.22f,-.1f);label.transform.localRotation=Quaternion.Euler(12,0,0);label.text=(row==0?"Original":"Studio")+" / "+actors[i];label.fontSize=50;label.characterSize=.022f;label.anchor=TextAnchor.MiddleCenter;label.color=new Color(.95f,.98f,1);
|
||||
}
|
||||
var floor=GameObject.CreatePrimitive(PrimitiveType.Plane);floor.name="Ground_Y0";floor.transform.SetParent(root.transform,false);floor.transform.localPosition=new Vector3(0,-.002f,0);floor.transform.localScale=new Vector3(1.05f,1,.57f);floor.GetComponent<Renderer>().sharedMaterial=AssetDatabase.LoadAssetAtPath<Material>("Assets/Bundles/Scenes/Review/EnemyReviewFloor.mat");Object.DestroyImmediate(floor.GetComponent<Collider>());
|
||||
var camera=new GameObject("EnemyStudioOverviewCamera").AddComponent<Camera>();camera.transform.SetParent(root.transform,false);camera.transform.localPosition=new Vector3(0,7,-10);camera.transform.LookAt(root.transform.position+Vector3.up*.45f);camera.orthographic=true;camera.orthographicSize=2.3f;camera.aspect=2;camera.nearClipPlane=.1f;camera.farClipPlane=100;camera.clearFlags=CameraClearFlags.SolidColor;camera.backgroundColor=new Color(.075f,.105f,.14f);camera.cullingMask=1<<26;camera.enabled=false;
|
||||
var light=new GameObject("OverviewLight").AddComponent<Light>();light.transform.SetParent(root.transform,false);light.type=LightType.Directional;light.intensity=1.1f;light.transform.localRotation=Quaternion.Euler(40,-35,0);light.cullingMask=1<<26;
|
||||
foreach(var t in root.GetComponentsInChildren<Transform>(true))t.gameObject.layer=26;
|
||||
EditorSceneManager.SaveScene(scene,"Assets/Bundles/Scenes/Review/Studio_Enemies_Overview.unity");await Task.Delay(100);
|
||||
camera.targetTexture=rt;camera.Render();RenderTexture.active=rt;texture.ReadPixels(new Rect(0,0,1800,900),0,0);texture.Apply();camera.targetTexture=null;
|
||||
const string path="Assets/Screenshots/enemy_studio_batch_overview.png";File.WriteAllBytes(Path.Combine(Application.dataPath,"../",path),texture.EncodeToPNG());AssetDatabase.ImportAsset(path);return path;
|
||||
}
|
||||
finally{RenderTexture.active=old;rt.Release();Object.DestroyImmediate(rt);Object.DestroyImmediate(texture);SceneManager.SetActiveScene(previous);EditorSceneManager.CloseScene(scene,true);}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,286 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using HotUpdate.Gameplay;
|
||||
using HotUpdate.Net;
|
||||
using HotUpdate.UI;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using TMPro;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityEngine.UI;
|
||||
|
||||
/// <summary>Unseeded first-day acceptance via actual EventSystem clicks and isolated HTTP.</summary>
|
||||
public static class VerifyFirstFive
|
||||
{
|
||||
const string Endpoint = "http://127.0.0.1:18085";
|
||||
const string Key = "AIGame.FirstFive.";
|
||||
static string Repo => Path.GetFullPath(Path.Combine(Application.dataPath, "../.."));
|
||||
static string Output => Path.Combine(Repo, "Tools/output/first_five");
|
||||
static PrototypeFlow Flow => UnityEngine.Object.FindObjectOfType<PrototypeFlow>();
|
||||
static T Get<T>(string field) => (T)typeof(PrototypeFlow).GetField(field, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(Flow);
|
||||
static void Set(string field, object value) => typeof(PrototypeFlow).GetField(field, BindingFlags.Instance | BindingFlags.NonPublic).SetValue(Flow, value);
|
||||
static void Check(bool value, string message) { if (!value) throw new Exception(message); }
|
||||
static async Task Until(Func<bool> condition, int seconds = 35)
|
||||
{
|
||||
var end = DateTime.UtcNow.AddSeconds(seconds);
|
||||
while (!condition()) { Check(DateTime.UtcNow < end, "Timeout: " + Flow?.Page); await Task.Delay(75); }
|
||||
}
|
||||
static Button Find(string name) => UnityEngine.Object.FindObjectsOfType<Button>().SingleOrDefault(b => b.name == "Btn_" + name && b.gameObject.activeInHierarchy);
|
||||
static async Task Click(string name)
|
||||
{
|
||||
await Until(() => Find(name) != null && Find(name).interactable);
|
||||
Button b = null; PointerEventData data = null;
|
||||
await Until(() => {
|
||||
Canvas.ForceUpdateCanvases(); b = Find(name); if (b == null || !b.interactable) return false;
|
||||
var rect = b.GetComponent<RectTransform>();
|
||||
data = new PointerEventData(EventSystem.current) { position = RectTransformUtility.WorldToScreenPoint(null, rect.TransformPoint(rect.rect.center)), button = PointerEventData.InputButton.Left };
|
||||
var hits = new List<RaycastResult>(); EventSystem.current.RaycastAll(data, hits);
|
||||
return hits.Count > 0 && ExecuteEvents.GetEventHandler<IPointerClickHandler>(hits[0].gameObject) == b.gameObject;
|
||||
}, 8);
|
||||
ExecuteEvents.Execute(b.gameObject, data, ExecuteEvents.pointerClickHandler);
|
||||
await Task.Delay(100);
|
||||
}
|
||||
static string Text(string name) => UnityEngine.Object.FindObjectsOfType<TextMeshProUGUI>().FirstOrDefault(t => t.name == "Txt_" + name && t.gameObject.activeInHierarchy)?.text;
|
||||
static JObject Wallet() => JObject.FromObject(new { Flow.Game.State.coins, Flow.Game.State.candy, Flow.Game.State.balls, Flow.Game.State.tickets, Flow.Game.State.level, Flow.Game.State.shots, Flow.Game.State.stages, Flow.Game.State.shards, Flow.Game.State.formation });
|
||||
static void Save(JObject report, string step)
|
||||
{
|
||||
report["step"] = step; report["updatedUtc"] = DateTime.UtcNow.ToString("O");
|
||||
if (Flow?.Game != null) report["current"] = Wallet();
|
||||
Directory.CreateDirectory(Output);
|
||||
File.WriteAllText(Path.Combine(Output, report.Value<string>("kind") == "guide" ? "ui_guide.json" : "ui_run.json"), report.ToString(Formatting.Indented));
|
||||
}
|
||||
static void Capture(string name)
|
||||
{
|
||||
var type = AppDomain.CurrentDomain.GetAssemblies().Select(a => a.GetType("Unity.Pipeline.Editor.Commands.Capture.CaptureCommands")).First(t => t != null);
|
||||
type.GetMethod("CaptureGameView", BindingFlags.Public | BindingFlags.Static).Invoke(null, new object[] { 1080, 1920, null, "Screenshots/first_five_" + name + ".png", false, 0, "screen" });
|
||||
}
|
||||
static async Task Home()
|
||||
{
|
||||
if (Flow.Page == "Home") return;
|
||||
Check(Find("Ok") == null, "Dismiss the operation result before navigating");
|
||||
await Click(Flow.Page == "UI_PrototypeBattle" ? "Home" : "Back");
|
||||
await Until(() => Flow.Page == "Home" && !Flow.IsBusy);
|
||||
}
|
||||
static async Task Open(string button, string page)
|
||||
{
|
||||
await Home(); await Click(button); await Until(() => Flow.Page == "UI_Prototype" + page && !Flow.IsBusy);
|
||||
}
|
||||
static async Task Operation(string button)
|
||||
{
|
||||
var previous = Get<PrototypeReply>("_reply");
|
||||
await Click(button); await Until(() => !Flow.IsBusy && !ReferenceEquals(Get<PrototypeReply>("_reply"), previous));
|
||||
if (Find("Ok") != null) await Click("Ok");
|
||||
Check(Get<PrototypeReply>("_reply").ok, "Rejected UI operation " + button);
|
||||
}
|
||||
static async Task Shot(JObject report)
|
||||
{
|
||||
if (Flow.Page != "UI_PrototypePinball") await Open("NavPinball", "Pinball");
|
||||
int count = Flow.Game.State.shots;
|
||||
Check(Flow.Game.State.balls > 0 && count < 60, "First-day shot budget exhausted");
|
||||
var before = Wallet(); await Click("Fire");
|
||||
await Until(() => !Flow.IsBusy && Flow.Game.State.shots == count + 1 && string.IsNullOrEmpty(Flow.Game.State.pendingShot), 25);
|
||||
((JArray)report["operations"]).Add(new JObject { ["action"] = "shot", ["before"] = before, ["after"] = Wallet() });
|
||||
Save(report, "shot " + Flow.Game.State.shots);
|
||||
}
|
||||
static async Task TrainTo(int level, JObject report)
|
||||
{
|
||||
while (Flow.Game.State.level < level)
|
||||
{
|
||||
int cost = Flow.Game.State.level * Get<PrototypeConfig>("_config").economy.trainCost;
|
||||
while (Flow.Game.State.candy < cost) await Shot(report);
|
||||
await Open("NavPets", "Pets");
|
||||
var before = Wallet(); await Operation("Train");
|
||||
Check(Flow.Game.State.level == (int)before["level"] + 1 && Flow.Game.State.candy == (int)before["candy"] - cost, "Training cost mismatch");
|
||||
((JArray)report["operations"]).Add(new JObject { ["action"] = "train", ["before"] = before, ["after"] = Wallet() });
|
||||
Save(report, "trained " + Flow.Game.State.level);
|
||||
}
|
||||
}
|
||||
public static string Begin()
|
||||
{
|
||||
Check(EditorApplication.isPlaying, "Enter Play Mode first");
|
||||
Check(!SessionState.GetBool(Key + "running", false), "Acceptance already running");
|
||||
SessionState.SetBool(Key + "running", true);
|
||||
_ = Run(); return "Started isolated first-five UI acceptance; progress in Tools/output/first_five/ui_run.json";
|
||||
}
|
||||
static async Task Run()
|
||||
{
|
||||
var report = new JObject { ["status"] = "running", ["endpoint"] = Endpoint, ["seededResources"] = false, ["startedUtc"] = DateTime.UtcNow.ToString("O"), ["operations"] = new JArray(), ["battles"] = new JArray() };
|
||||
try
|
||||
{
|
||||
await Until(() => Flow?.Game != null && !Flow.IsBusy);
|
||||
Check(string.IsNullOrEmpty(Flow.Game.State.pendingShot) && string.IsNullOrEmpty(Flow.Game.State.pendingBattle) && string.IsNullOrEmpty(Flow.Game.State.pendingFish), "Leave existing activity intact before acceptance");
|
||||
SessionState.SetString(Key + "original", JsonUtility.ToJson(Flow.Game.State));
|
||||
SessionState.SetString(Key + "endpoint", Get<string>("_httpBase"));
|
||||
AuthResponse auth = null; string error = null; bool done = false;
|
||||
string username = "firstfive_" + Guid.NewGuid().ToString("N");
|
||||
Flow.StartCoroutine(AuthApi.Register(Endpoint, username, "isolated-first-five-password", (r, e) => { auth = r; error = e; done = true; }));
|
||||
await Until(() => done); Check(auth != null, "Register: " + error);
|
||||
var session = new SessionData { Pid = auth.pid, Token = auth.token, Username = username };
|
||||
report["account"] = username; SessionState.SetInt(Key + "pid", (int)auth.pid);
|
||||
UiManager.Instance.Get(ConfirmDialogView.PrefabName).GetComponent<ConfirmDialogView>().Hide();
|
||||
Set("_session", new Func<SessionData>(() => session)); Set("_profile", new Func<long>(() => session.Pid)); Set("_httpBase", Endpoint); Set("_boundProfile", 0L);
|
||||
Flow.Handle("Home"); await Until(() => Flow.Game != null && !Flow.IsBusy && Get<long>("_boundProfile") == session.Pid);
|
||||
Check(Flow.Game.State.balls == 20 && Flow.Game.State.coins == 0 && Flow.Game.State.candy == 0 && Flow.Game.State.level == 1 && Flow.Game.State.stages.Count(s => s > 0) == 2, "Not a genuine fresh account");
|
||||
Check(Text("Task") == "发射第一枚弹珠", "Missing initial guide");
|
||||
report["initial"] = Wallet(); Save(report, "fresh account");
|
||||
await Shot(report); Check(Flow.Game.State.tickets == 1, "First-shot ticket missing");
|
||||
await Click("Capture"); await Until(() => Flow.Page == "UI_PrototypeCapture");
|
||||
await Click("Capture"); await Until(() => !Flow.IsBusy && Flow.Game.State.captureTutorialDone);
|
||||
Check(Flow.Game.State.stages[2] == 1 && Flow.Game.State.tickets == 0, "Tutorial capture did not grant BudBud");
|
||||
await Click("Ok"); await Until(() => Flow.Page == "UI_PrototypePets"); await Home();
|
||||
await TrainTo(2, report);
|
||||
|
||||
for (int stage = 1; stage <= 5; stage++)
|
||||
{
|
||||
await TrainTo(Math.Max(2, stage), report);
|
||||
await Open("Adventure", "Stages"); await Click("Stage" + stage); await Until(() => Flow.Page == "UI_PrototypeFormation" && !Flow.IsBusy);
|
||||
await Operation("AutoDeploy");
|
||||
var before = Wallet(); Save(report, "formation " + stage); Capture("formation" + stage);
|
||||
await Click("StartBattle"); await Until(() => Flow.Page == "UI_PrototypeBattle" && Flow.Battle != null, 45);
|
||||
Check(Flow.Battle.Authoritative && Get<PrototypeReply>("_reply").battle.snapshot.rulesVersion == 3, "Old combat path used");
|
||||
var remote = Get<PrototypeReply>("_reply").battle;
|
||||
var battle = new JObject { ["stage"] = stage, ["before"] = before, ["traceHash"] = remote.trace.traceHash, ["events"] = remote.trace.eventCount };
|
||||
((JArray)report["battles"]).Add(battle); Save(report, "battle " + stage);
|
||||
await Click("Speed");
|
||||
await Until(() => Flow.Battle.Finished && !Flow.IsBusy && string.IsNullOrEmpty(Flow.Game.State.pendingBattle), 100);
|
||||
Check(Flow.Battle.TraceFinalStateMatches, "Authority replay final state mismatch");
|
||||
battle["won"] = Flow.Battle.Won; battle["seconds"] = Flow.Battle.Time; battle["after"] = Wallet(); battle["resultText"] = Text("ResultInfo");
|
||||
battle["receipt"] = JToken.FromObject(Get<PrototypeReply>("_reply").result); Capture("result" + stage); Save(report, "result " + stage);
|
||||
Check(Flow.Battle.Won, "Normal starter roster lost stage " + stage + " at level " + Flow.Game.State.level);
|
||||
Check(Flow.Game.State.clearedStages[stage - 1] == 1, "Clear flag missing");
|
||||
var reward = Get<PrototypeConfig>("_config").Stage(stage).reward;
|
||||
Check(Flow.Game.State.coins == (int)before["coins"] + reward.coins && Flow.Game.State.candy == (int)before["candy"] + reward.candy && Flow.Game.State.balls == (int)before["balls"] + reward.balls, "First-clear reward mismatch");
|
||||
await Home();
|
||||
if (stage == 1)
|
||||
{
|
||||
Check(Text("Task") == "领取首通目标奖励", "Goal guide missing");
|
||||
await Open("Tasks", "Tasks"); await Operation("ClaimGoal"); await Home();
|
||||
await Open("Mail", "Mail"); await Operation("ClaimAllMail"); await Home();
|
||||
await Open("Daily", "Signin"); await Operation("Signin0"); await Home();
|
||||
await Open("NavShop", "Shop"); await Operation("BuyGoods0"); await Home();
|
||||
await Open("Rewards", "Chest"); await Operation("OpenChest0"); await Home();
|
||||
Save(report, "normal first-day support rewards claimed");
|
||||
}
|
||||
}
|
||||
report["status"] = "pass"; report["final"] = Wallet();
|
||||
report["note"] = "Fresh account; only initial two pets plus guaranteed tutorial BudBud, T1 throughout; actual UI, protocol1/rules3; no save seeding, no injected wallet, clock or random draw.";
|
||||
Save(report, "complete");
|
||||
}
|
||||
catch (Exception error)
|
||||
{
|
||||
report["status"] = "failed"; report["error"] = error.ToString(); report["page"] = Flow?.Page; report["dialog"] = Text("Message");
|
||||
Save(report, "failed");
|
||||
}
|
||||
finally { SessionState.SetBool(Key + "running", false); }
|
||||
}
|
||||
public static async Task<string> Cleanup()
|
||||
{
|
||||
Check(!SessionState.GetBool(Key + "running", false), "Wait for acceptance completion before cleanup");
|
||||
var net = UnityEngine.Object.FindObjectOfType<GameNet>();
|
||||
UiManager.Instance.Get(ConfirmDialogView.PrefabName).GetComponent<ConfirmDialogView>().Hide();
|
||||
Set("_session", new Func<SessionData>(() => net.Session)); Set("_profile", new Func<long>(() => net.Session?.Pid ?? 0));
|
||||
Set("_httpBase", SessionState.GetString(Key + "endpoint", "http://127.0.0.1:8080")); Set("_boundProfile", 0L);
|
||||
Flow.Handle("Home"); await Until(() => Flow.Game != null && !Flow.IsBusy && Get<string>("_httpBase") != Endpoint && Get<long>("_boundProfile") == net.Session.Pid);
|
||||
var before = JsonUtility.FromJson<PrototypeSave>(SessionState.GetString(Key + "original", "")); var after = Flow.Game.State;
|
||||
Check(after.coins == before.coins && after.candy == before.candy && after.level == before.level && after.shots == before.shots && after.stages.SequenceEqual(before.stages) && after.formation.SequenceEqual(before.formation), "Original account changed");
|
||||
PlayerPrefs.DeleteKey("AIGame.G1.pending." + Uri.EscapeDataString(Endpoint) + "." + SessionState.GetInt(Key + "pid", 0));
|
||||
return "PASS original account and endpoint restored; coins/candy/level/shots/roster/formation unchanged";
|
||||
}
|
||||
|
||||
public static string BeginGuide()
|
||||
{
|
||||
Check(EditorApplication.isPlaying && !SessionState.GetBool(Key + "running", false), "Need idle Play Mode");
|
||||
SessionState.SetBool(Key + "running", true); _ = Guide();
|
||||
return "Started real fresh-account guide shortage / ready / trained checks";
|
||||
}
|
||||
public static string AnimationLifecycle()
|
||||
{
|
||||
Check(EditorApplication.isPlaying, "Use Play Mode");
|
||||
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/Scenes/Prototype/PrototypeArena.prefab");
|
||||
var arena = UnityEngine.Object.Instantiate(prefab); arena.name = "FirstFiveAnimationLifecycle";
|
||||
var messages = new List<string>();
|
||||
Application.LogCallback observe = (message, stack, kind) => { if (kind == LogType.Warning || kind == LogType.Error || kind == LogType.Exception) messages.Add(message); };
|
||||
try
|
||||
{
|
||||
foreach (var camera in arena.GetComponentsInChildren<Camera>(true)) camera.enabled = false;
|
||||
var fx = arena.GetComponentInChildren<BattleSkillPresentation>(true);
|
||||
var hero = arena.transform.Find("Heroes/Hero0"); var visual = hero.Find("Visual");
|
||||
var animator = visual.GetComponentInChildren<Animator>(true);
|
||||
Application.logMessageReceived += observe;
|
||||
arena.SetActive(false); fx.Animate(animator, true, 0, 1, -1, 0, 0, false);
|
||||
arena.SetActive(true); hero.gameObject.SetActive(true); visual.gameObject.SetActive(true); animator.enabled = false;
|
||||
fx.Animate(animator, true, 0, 2, -1, 0, 0, false);
|
||||
animator.enabled = true; fx.Animate(animator, true, 0, 3, -1, 0, 0, false);
|
||||
Check(animator.GetCurrentAnimatorStateInfo(0).IsName("Idle"), "Re-enabled animator did not resume sampling");
|
||||
hero.gameObject.SetActive(false); fx.Animate(animator, true, 0, 4, -1, 0, 0, false);
|
||||
Check(messages.Count == 0, "Animation lifecycle logs: " + string.Join("; ", messages));
|
||||
Directory.CreateDirectory(Output);
|
||||
File.WriteAllText(Path.Combine(Output, "animation_lifecycle.json"), JsonConvert.SerializeObject(new { status = "pass", inactiveParent = true, disabledAnimator = true, reenabledSampling = true, hiddenUnit = true, warnings = 0 }));
|
||||
return "PASS pooled animation: inactive/disabled/hidden skip silently; re-enabled samples Idle";
|
||||
}
|
||||
finally { Application.logMessageReceived -= observe; UnityEngine.Object.Destroy(arena); }
|
||||
}
|
||||
static async Task Guide()
|
||||
{
|
||||
var report = new JObject { ["kind"] = "guide", ["status"] = "running", ["operations"] = new JArray() };
|
||||
try
|
||||
{
|
||||
await Until(() => Flow?.Game != null && !Flow.IsBusy);
|
||||
SessionState.SetString(Key + "original", JsonUtility.ToJson(Flow.Game.State));
|
||||
SessionState.SetString(Key + "endpoint", Get<string>("_httpBase"));
|
||||
AuthResponse auth = null; bool done = false;
|
||||
Flow.StartCoroutine(AuthApi.Register(Endpoint, "firstguide_" + Guid.NewGuid().ToString("N"), "isolated-first-five-password", (r, e) => { auth = r; done = true; }));
|
||||
await Until(() => done); Check(auth != null, "Guide register failed");
|
||||
var session = new SessionData { Pid = auth.pid, Token = auth.token }; SessionState.SetInt(Key + "pid", (int)auth.pid);
|
||||
UiManager.Instance.Get(ConfirmDialogView.PrefabName).GetComponent<ConfirmDialogView>().Hide();
|
||||
Set("_session", new Func<SessionData>(() => session)); Set("_profile", new Func<long>(() => session.Pid)); Set("_httpBase", Endpoint); Set("_boundProfile", 0L);
|
||||
Flow.Handle("Home"); await Until(() => Flow.Game != null && !Flow.IsBusy && Get<long>("_boundProfile") == session.Pid);
|
||||
await Shot(report); await Click("Capture"); await Until(() => Flow.Page == "UI_PrototypeCapture");
|
||||
await Click("Capture"); await Until(() => !Flow.IsBusy && Flow.Game.State.captureTutorialDone); await Click("Ok"); await Until(() => Flow.Page == "UI_PrototypePets"); await Home();
|
||||
Check(Flow.Game.State.candy == 20 && Text("Task") == "发射弹珠,补足训练糖果", "Shortage guide was " + Text("Task"));
|
||||
report["shortage"] = Text("Task"); Capture("guide_shortage");
|
||||
await Shot(report); await Home(); Check(Flow.Game.State.candy == 40 && Text("Task") == "用糖果做一次共享训练", "Ready guide was " + Text("Task"));
|
||||
report["ready"] = Text("Task"); Capture("guide_ready");
|
||||
await Open("NavPets", "Pets"); await Operation("Train"); await Home();
|
||||
Check(Flow.Game.State.level == 2 && Text("Task") == "布阵并完成教学关 1-1", "Trained guide was " + Text("Task"));
|
||||
report["trained"] = Text("Task"); report["status"] = "pass"; Save(report, "guide complete");
|
||||
}
|
||||
catch (Exception error) { report["status"] = "failed"; report["error"] = error.ToString(); Save(report, "guide failed"); }
|
||||
finally { SessionState.SetBool(Key + "running", false); }
|
||||
}
|
||||
public static string BeginBattleSmoke()
|
||||
{
|
||||
Check(EditorApplication.isPlaying && Get<string>("_httpBase") == Endpoint && !SessionState.GetBool(Key + "running", false), "Need completed isolated guide");
|
||||
SessionState.SetBool(Key + "running", true); _ = BattleSmoke(); return "Started post-fix real HTTP battle and warning check";
|
||||
}
|
||||
static async Task BattleSmoke()
|
||||
{
|
||||
var report = new JObject { ["status"] = "running" }; var messages = new List<string>();
|
||||
Application.LogCallback observe = (message, stack, kind) => {
|
||||
if (kind == LogType.Error || kind == LogType.Exception || (kind == LogType.Warning && message.Contains("Animator"))) messages.Add(message);
|
||||
};
|
||||
Application.logMessageReceived += observe;
|
||||
try
|
||||
{
|
||||
await Open("Adventure", "Stages"); await Click("Stage1"); await Until(() => Flow.Page == "UI_PrototypeFormation");
|
||||
await Click("StartBattle"); await Until(() => Flow.Page == "UI_PrototypeBattle" && Flow.Battle != null);
|
||||
Check(Flow.Battle.Authoritative, "Missing authority"); await Click("Speed");
|
||||
await Until(() => Flow.Battle.Finished && !Flow.IsBusy && string.IsNullOrEmpty(Flow.Game.State.pendingBattle), 90);
|
||||
Check(Flow.Battle.Won && Flow.Battle.TraceFinalStateMatches, "Post-fix battle failed");
|
||||
Check(messages.Count == 0, "Post-fix errors/animator warnings: " + string.Join("; ", messages.Distinct()));
|
||||
report["status"] = "pass"; report["authoritative"] = true; report["finalStateExact"] = true; report["animatorWarnings"] = 0; report["errors"] = 0;
|
||||
}
|
||||
catch (Exception error) { report["status"] = "failed"; report["error"] = error.ToString(); }
|
||||
finally
|
||||
{
|
||||
Application.logMessageReceived -= observe; SessionState.SetBool(Key + "running", false);
|
||||
File.WriteAllText(Path.Combine(Output, "postfix_battle.json"), report.ToString(Formatting.Indented));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -57,14 +57,18 @@ public static class VerifyFormalEnemies
|
||||
{
|
||||
foreach (var slot in instance.transform.Find("Enemies").Cast<Transform>())
|
||||
{
|
||||
Check(slot.Cast<Transform>().All(c => c.name == "SlowMark" || c.name.StartsWith("Type")), slot.name + " still has primitive parts");
|
||||
Check(slot.Cast<Transform>().All(c => c.name == "SlowMark" || c.name=="SkillMuzzle" || c.name.StartsWith("Type")), slot.name + " still has primitive parts");
|
||||
for (int t = 0; t < Types; t++)
|
||||
{
|
||||
var visual = slot.Find("Type" + t);
|
||||
Check(visual != null && PrefabUtility.IsAnyPrefabInstanceRoot(visual.gameObject) && !visual.gameObject.activeSelf, slot.name + " Type" + t + " missing or active");
|
||||
var actor = new[] { "Hornlet", "Dashlet", "Shellhorn", "HornCaptain", "GreatHorn" }[t];
|
||||
Check(PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(visual.gameObject) == "Assets/Bundles/Characters/Enemy/" + actor + "Studio/" + actor + "Studio_Enemy.prefab", slot.name + " Type" + t + " still references the old model");
|
||||
Check(visual.GetComponentsInChildren<Transform>(true).All(x => x.gameObject.layer == 30), slot.name + " Type" + t + " not on battle layer 30");
|
||||
var animator = visual.GetComponentInChildren<Animator>(true);
|
||||
Check(animator != null && animator.runtimeAnimatorController != null && !animator.applyRootMotion, slot.name + " Type" + t + " animator missing");
|
||||
var original = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/Characters/Enemy/" + actor + "/" + actor + "_Enemy.prefab").GetComponentInChildren<Animator>(true);
|
||||
Check(animator.avatar == original.avatar && animator.runtimeAnimatorController == original.runtimeAnimatorController, actor + " must reuse original Avatar/controller");
|
||||
if (slot.name != "Enemy0") continue;
|
||||
slot.gameObject.SetActive(true); visual.gameObject.SetActive(true);
|
||||
float min = float.MaxValue, max = float.MinValue; var mesh = new Mesh();
|
||||
|
||||
@@ -55,7 +55,7 @@ public static class VerifyFormalHeroes
|
||||
var hero = arena.transform.Find("Heroes/Hero" + id);
|
||||
var visual = hero.Find("Visual");
|
||||
Check(visual != null && PrefabUtility.IsAnyPrefabInstanceRoot(visual.gameObject), "Hero" + id + " lacks nested formal prefab");
|
||||
Check(hero.Cast<Transform>().All(c => c.name == "Visual" || c.name == "T2Crest"), "Hero" + id + " still has primitive parts");
|
||||
Check(hero.Cast<Transform>().All(c => c.name == "Visual" || c.name == "VisualT2" || c.name == "T2Crest"), "Hero" + id + " still has primitive parts");
|
||||
Check(visual.GetComponentsInChildren<Transform>(true).All(t => t.gameObject.layer == 30), "Hero" + id + " visual not on battle layer 30");
|
||||
var animator = visual.GetComponentInChildren<Animator>(true);
|
||||
Check(animator != null && animator.runtimeAnimatorController != null && !animator.applyRootMotion, "Hero" + id + " animator missing");
|
||||
@@ -112,7 +112,12 @@ public static class VerifyFormalHeroes
|
||||
var arena = Get<GameObject>("_arena");
|
||||
var fielded = Flow.Battle.Heroes.Select(h => h.Pet).Where(p => Formal.Contains(p)).Distinct().ToArray();
|
||||
Check(fielded.Length > 0, "No formal partner fielded in 1-" + stage);
|
||||
var animators = fielded.ToDictionary(p => p, p => arena.transform.Find("Heroes/Hero" + p + "/Visual").GetComponentInChildren<Animator>());
|
||||
// Tier-2 partners show VisualT2 (same rig + evolution accessory); read whichever visual is currently shown.
|
||||
Animator Shown(int p) { var hero = arena.transform.Find("Heroes/Hero" + p); var t2 = hero.Find("VisualT2"); return (t2 != null && t2.gameObject.activeSelf ? t2 : hero.Find("Visual")).GetComponentInChildren<Animator>(); }
|
||||
await Task.Delay(300);
|
||||
var evolved = Flow.Battle.Heroes.Where(h => h.Tier == 2 && arena.transform.Find("Heroes/Hero" + h.Pet + "/VisualT2") != null).Select(h => h.Pet).Distinct().ToArray();
|
||||
foreach (var p in evolved) Check(arena.transform.Find("Heroes/Hero" + p + "/VisualT2").gameObject.activeSelf && !arena.transform.Find("Heroes/Hero" + p + "/Visual").gameObject.activeSelf, "Hero" + p + " tier 2 does not show VisualT2");
|
||||
var animators = fielded.ToDictionary(p => p, Shown);
|
||||
var attacked = new HashSet<int>(); var end = DateTime.UtcNow.AddSeconds(stage > 1 ? 45 : 20);
|
||||
string shot = seededUser != null ? "seeded_" : "";
|
||||
await Capture(shot + "idle"); bool attackShot = false;
|
||||
@@ -125,7 +130,7 @@ public static class VerifyFormalHeroes
|
||||
Check(attacked.Count == fielded.Length, "Attack never played for " + string.Join(",", fielded.Except(attacked)));
|
||||
Click("Speed");
|
||||
await Until(() => animators.Values.All(a => !a.isActiveAndEnabled || Mathf.Approximately(a.speed, 2)), 5);
|
||||
return "PASS formal partners " + string.Join(",", fielded) + " fielded in 1-" + stage + ", played Attack and follow 2x speed; screenshots formal_heroes_" + shot + "idle/attack.png";
|
||||
return "PASS formal partners " + string.Join(",", fielded) + " (T2 visuals " + string.Join(",", evolved) + ") fielded in 1-" + stage + ", played Attack and follow 2x speed; screenshots formal_heroes_" + shot + "idle/attack.png";
|
||||
}
|
||||
|
||||
public static async Task<string> OpenSeedAccount()
|
||||
@@ -169,7 +174,12 @@ public static class VerifyFormalHeroes
|
||||
var fielded = Flow.Battle.Heroes.Select(h => h.Pet).OrderBy(p => p).ToArray();
|
||||
Check(fielded.SequenceEqual(new[] { 3, 4 }), "1-1 fielded " + string.Join(",", fielded));
|
||||
Check(Flow.Battle.Heroes.Single(h => h.Pet == 4).Slot == 0 && Flow.Battle.Heroes.Single(h => h.Pet == 3).Slot == 1, "Turtle is not in front of the bird");
|
||||
var animators = fielded.ToDictionary(p => p, p => arena.transform.Find("Heroes/Hero" + p + "/Visual").GetComponentInChildren<Animator>());
|
||||
// Tier-2 partners show VisualT2 (same rig + evolution accessory); read whichever visual is currently shown.
|
||||
Animator Shown(int p) { var hero = arena.transform.Find("Heroes/Hero" + p); var t2 = hero.Find("VisualT2"); return (t2 != null && t2.gameObject.activeSelf ? t2 : hero.Find("Visual")).GetComponentInChildren<Animator>(); }
|
||||
await Task.Delay(300);
|
||||
var evolved = Flow.Battle.Heroes.Where(h => h.Tier == 2 && arena.transform.Find("Heroes/Hero" + h.Pet + "/VisualT2") != null).Select(h => h.Pet).Distinct().ToArray();
|
||||
foreach (var p in evolved) Check(arena.transform.Find("Heroes/Hero" + p + "/VisualT2").gameObject.activeSelf && !arena.transform.Find("Heroes/Hero" + p + "/Visual").gameObject.activeSelf, "Hero" + p + " tier 2 does not show VisualT2");
|
||||
var animators = fielded.ToDictionary(p => p, Shown);
|
||||
foreach (var kv in animators) Check(kv.Value != null && arena.transform.Find("Heroes/Hero" + kv.Key).gameObject.activeInHierarchy, "Hero" + kv.Key + " inactive");
|
||||
var attacked = new HashSet<int>(); var end = DateTime.UtcNow.AddSeconds(25);
|
||||
await Capture("bird_turtle_idle"); bool attackShot = false;
|
||||
|
||||
@@ -53,7 +53,14 @@ public static class VerifyG3
|
||||
save.shots = 1; save.tickets = 1;
|
||||
Check(MainHudView.GuideTask(save) == "用捕捉券获得芽芽", "Capture guide");
|
||||
save.captureTutorialDone = true;
|
||||
save.candy = 20;
|
||||
Check(MainHudView.GuideTask(save) == "发射弹珠,补足训练糖果", "Training shortage must point to an available action");
|
||||
save.balls = 0;
|
||||
Check(MainHudView.GuideTask(save) == "领取免费补给,再收集训练糖果", "No-ball shortage guide");
|
||||
save.balls = 20; save.candy = 30;
|
||||
Check(MainHudView.GuideTask(save) == "用糖果做一次共享训练", "Train guide");
|
||||
var config = new PrototypeConfig { economy = new EconomyConfig { trainCost = 60 } };
|
||||
Check(MainHudView.GuideTask(save, config) == "发射弹珠,补足训练糖果", "Training guide must use server config cost");
|
||||
save.level = 2;
|
||||
Check(MainHudView.GuideTask(save) == "布阵并完成教学关 1-1", "Battle guide");
|
||||
save.cleared = true;
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using HotUpdate.Gameplay;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using Object=UnityEngine.Object;
|
||||
|
||||
/// <summary>Presentation routing/lifecycle tests and independent contact sheet; never writes an account.</summary>
|
||||
public static class VerifyPartnerSkillFx
|
||||
{
|
||||
static string Repo=>Path.GetFullPath(Path.Combine(Application.dataPath,"../.."));
|
||||
const string Folder="Doc/Design/Combat/PartnerSkills";
|
||||
const string Bank="Assets/Bundles/Combat/BattleSkillPresentation.prefab";
|
||||
static void Check(bool condition,string message){if(!condition)throw new Exception(message);}
|
||||
static void Report(string name,object value){Directory.CreateDirectory(Path.Combine(Repo,Folder));File.WriteAllText(Path.Combine(Repo,Folder,name+".json"),JsonConvert.SerializeObject(value,Formatting.Indented));}
|
||||
static ParticleSystem[] Roots(BattleSkillPresentation p)=>p.GetComponentsInChildren<ParticleSystem>().Where(ps=>ps.transform.parent.GetComponent<ParticleSystem>()==null).ToArray();
|
||||
static Vector3 Point(int id)=>new Vector3(id<100?-2:2,1,(id<100?id%3:id%3)-1);
|
||||
public static string Behavior()
|
||||
{
|
||||
Check(EditorApplication.isPlaying,"Use Play Mode");bool original=PrototypeClientPrefs.Sfx;var root=Object.Instantiate(AssetDatabase.LoadAssetAtPath<GameObject>(Bank));var p=root.GetComponent<BattleSkillPresentation>();
|
||||
var config=JsonUtility.FromJson<PrototypeConfig>(File.ReadAllText(Path.Combine(Repo,"Config/Gameplay/greenfield.json")));
|
||||
try
|
||||
{
|
||||
PrototypeClientPrefs.Sfx=true;Check(p.EffectKinds==15&&p.ProfileCount==10,"Missing profiles");int cast=1;
|
||||
Action<string,int,int,int> cue=(kind,pet,target,c)=>p.Play(new CombatEvent{kind=kind,source=pet,target=target,cast=c,skill="pet."+pet+".ability",arrival=10,expires=20},0,Point,config);
|
||||
for(int pet=0;pet<10;pet++)
|
||||
{
|
||||
int c=cast++;cue("cast_start",pet,100,c);cue("release",pet,100,c);
|
||||
cue(pet==0||pet==9?"shield":pet==2||pet==7?"heal":pet==4||pet==5?"slow":"hit",pet,pet==0||pet==2||pet==7||pet==9?pet:100,c);
|
||||
cue("cast_end",pet,100,c);
|
||||
}
|
||||
cue("hit",4,100,cast++);cue("hit",0,100,cast++);
|
||||
for(int i=5;i<15;i++)Check(p.EffectPlays[i]>0,"Unreached signature effect "+i);
|
||||
for(int i=0;i<9;i++)Check(p.SoundPlays[i]>0,"Unreached sound "+i);
|
||||
int sounds=p.SoundPlays[7];int chain=cast++;for(int target=100;target<103;target++)cue("hit",3,target,chain);Check(p.SoundPlays[7]==sounds+1,"Chain amplified lightning sound");
|
||||
foreach(var line in root.GetComponentsInChildren<LineRenderer>().Where(l=>l.enabled))
|
||||
{
|
||||
Check(Vector3.Distance(line.transform.TransformPoint(line.GetPosition(0)),Point(3))<.001f||Vector3.Distance(line.transform.TransformPoint(line.GetPosition(0)),Point(8))<.001f,"Beam source detached");
|
||||
Check(Enumerable.Range(100,3).Any(t=>Vector3.Distance(line.transform.TransformPoint(line.GetPosition(line.positionCount-1)),Point(t))<.001f),"Beam end detached");
|
||||
}
|
||||
int count=p.PlayedEffects; p.Play(new CombatEvent{kind="hit",source=3,target=100,cast=cast++,tick=0},1,Point,config);Check(p.PlayedEffects==count,"Stale catch-up replayed a hit");
|
||||
// Recycle the four beam roots while earlier flash leases still exist.
|
||||
for(int i=0;i<12;i++)cue("hit",3,100,cast++);Check(Roots(p).Length==76,"Pool expanded");p.Render(.3f,Point,_=>true);Check(root.GetComponentsInChildren<LineRenderer>().All(l=>!l.enabled),"Expired/recycled beam leaked");
|
||||
cue("projectile",1,100,cast++);p.Render(.2f,Point,_=>true);Check(p.ActiveShots==1,"No projectile");var shot=Roots(p).Single(ps=>ps.isPlaying&&ps.name.Contains("Fireball"));Vector3 before=shot.transform.position;
|
||||
p.SetPlayback(true,2);p.Render(.2f,Point,_=>true);Check(Vector3.Distance(before,shot.transform.position)<.001f&&shot.isPaused,"Pause moved projectile");Check(root.GetComponentsInChildren<ParticleSystem>().All(ps=>Mathf.Approximately(ps.main.simulationSpeed,2)),"2x missed child emitter");p.SetPlayback(false,2);
|
||||
p.Render(.3f,Point,_=>false);Check(p.ActiveShots==0,"Dead target retained projectile");
|
||||
cue("death",0,0,cast++);Check(p.ActiveShields==1,"Death did not remove shield");cue("shield_expired",9,9,cast++);Check(p.ActiveShields==0,"Status expiry retained shield");
|
||||
cue("cast_start",1,100,cast);Check(p.ActiveCharges==1,"No charge");cue("cancel",1,100,cast++);Check(p.ActiveCharges==0,"Cancel retained charge");
|
||||
PrototypeClientPrefs.Sfx=false;sounds=p.PlayedSounds;cue("hit",3,100,cast++);Check(p.PlayedSounds==sounds&&root.GetComponentsInChildren<AudioSource>().All(a=>!a.isPlaying),"Mute failed");PrototypeClientPrefs.Sfx=true;
|
||||
int[] effects=p.EffectPlays.ToArray(),audio=p.SoundPlays.ToArray();cue("battle_end",0,0,0);Check(p.ActiveShots+p.ActiveCharges+p.ActiveShields+p.ActiveBeams==0&&root.GetComponentsInChildren<ParticleSystem>().All(ps=>!ps.IsAlive())&&root.GetComponentsInChildren<AudioSource>().All(a=>!a.isPlaying),"Battle end retained resources");
|
||||
cue("shield",0,0,cast++);root.SetActive(false);Check(p.ActiveShields==0,"Disable retained shield");root.SetActive(true);
|
||||
// Replay every exported server trace through the actual presentation consumer.
|
||||
var rows=new List<object>();var used=new HashSet<int>();
|
||||
foreach(var file in Directory.GetFiles(Path.Combine(Repo,"Tools/output/combat_runtime/traces"),"*.json"))
|
||||
{
|
||||
p.ResetPlayback();var trace=JObject.Parse(File.ReadAllText(file));var events=trace["events"].ToObject<CombatEvent[]>();
|
||||
foreach(var e in events){float time=e.tick*.05f;p.Play(e,time,Point,config);p.Render(time,Point,_=>true);if(e.source>=0&&e.source<10)used.Add(e.source);}
|
||||
Check(p.ActiveShots+p.ActiveCharges+p.ActiveShields+p.ActiveBeams==0,"Trace end leak "+file);rows.Add(new{trace=Path.GetFileName(file),events=events.Length,effects=p.PlayedEffects,sounds=p.PlayedSounds});
|
||||
}
|
||||
Check(rows.Count==23&&used.Count==10,"Incomplete trace coverage");
|
||||
Report("behavior",new{status="pass",profiles=10,effectKinds=15,poolRoots=76,voices=8,audioClips=9,signatureEffectPlays=effects,soundPlays=audio,chainSoundOnce=true,beamEndpoints=true,poolReuse=true,pause=true,speed2=true,staleSkip=true,death=true,expiry=true,cancel=true,mute=true,endCleanup=true,disableCleanup=true,traceCases=rows.Count,traceActors=used.Count,rows,networkAccountWrites=false});return "PASS 10 signatures / 9 sounds, 23 server traces, chain dedup, beams, pause/2x/mute/reuse/cleanup";
|
||||
}
|
||||
finally{PrototypeClientPrefs.Sfx=original;Object.Destroy(root);}
|
||||
}
|
||||
public static async Task<string> ContactSheet()
|
||||
{
|
||||
Check(EditorApplication.isPlaying,"Use Play Mode");var root=new GameObject("PartnerSkillContactSheet");root.transform.position=new Vector3(500,0,0);
|
||||
try
|
||||
{
|
||||
var config=JObject.Parse(File.ReadAllText(Path.Combine(Repo,"Config/Combat/partner_presentations_v1.json")));
|
||||
var arena=AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Bundles/Scenes/Prototype/PrototypeArena.prefab");
|
||||
for(int pet=0;pet<10;pet++)
|
||||
{
|
||||
var cell=new GameObject("Cell"+pet);cell.transform.SetParent(root.transform,false);cell.transform.localPosition=new Vector3((pet%5-2)*4.2f,0,(pet<5?1:-1)*3.4f);
|
||||
var hero=Object.Instantiate(arena.transform.Find("Heroes/Hero"+pet+"/Visual").gameObject,cell.transform);hero.SetActive(true);hero.transform.localPosition=Vector3.zero;hero.transform.localRotation=Quaternion.identity;
|
||||
foreach(var animator in hero.GetComponentsInChildren<Animator>()){animator.enabled=false;var clip=animator.runtimeAnimatorController.animationClips.FirstOrDefault(c=>c.name.Contains("Idle"));if(clip!=null)clip.SampleAnimation(animator.gameObject,.25f);}
|
||||
foreach(var t in hero.GetComponentsInChildren<Transform>(true))t.gameObject.layer=30;
|
||||
var effect=Object.Instantiate(AssetDatabase.LoadAssetAtPath<GameObject>((string)config["effects"][pet]["path"]),cell.transform);effect.transform.localPosition=(bool)config["effects"][pet]["ground"]?Vector3.up*.04f:Vector3.up*.9f;
|
||||
if(pet==6)effect.transform.localRotation=Quaternion.Euler(0,60,0);
|
||||
var ps=effect.GetComponent<ParticleSystem>();ps.Play(true);foreach(var child in effect.GetComponentsInChildren<ParticleSystem>())if(child.main.loop)child.Emit(1);ps.Simulate(.14f,true,false,true);ps.Pause(true);
|
||||
foreach(var line in effect.GetComponentsInChildren<LineRenderer>()){for(int n=0;n<9;n++)line.SetPosition(n,new Vector3(-1.5f+n*.1875f,n==0||n==8?0:(n%2==0?.1f:-.1f),0));line.enabled=true;}
|
||||
var label=new GameObject("Label");label.transform.SetParent(cell.transform,false);label.layer=30;label.transform.localPosition=new Vector3(0,0,-1.6f);label.transform.rotation=Quaternion.Euler(55,0,0);var text=label.AddComponent<TextMesh>();text.text=(string)config["profiles"][pet]["actor"];text.anchor=TextAnchor.MiddleCenter;text.fontSize=36;text.characterSize=.065f;text.color=new Color(.8f,.9f,1);
|
||||
}
|
||||
var cameraObject=new GameObject("ReviewCamera");cameraObject.transform.SetParent(root.transform,false);cameraObject.transform.localPosition=new Vector3(0,20,-15);cameraObject.transform.LookAt(root.transform.position+Vector3.up*.4f);var camera=cameraObject.AddComponent<Camera>();camera.cullingMask=1<<30;camera.clearFlags=CameraClearFlags.SolidColor;camera.backgroundColor=new Color(.035f,.055f,.08f);camera.orthographic=true;camera.orthographicSize=7.5f;
|
||||
var lightObject=new GameObject("ReviewLight");lightObject.transform.SetParent(root.transform,false);lightObject.transform.rotation=Quaternion.Euler(50,-25,0);var light=lightObject.AddComponent<Light>();light.type=LightType.Directional;light.intensity=1.25f;light.cullingMask=1<<30;
|
||||
await Task.Delay(80);var old=RenderTexture.active;var rt=new RenderTexture(2000,1200,24);var tex=new Texture2D(2000,1200,TextureFormat.RGB24,false);
|
||||
try{camera.targetTexture=rt;camera.Render();RenderTexture.active=rt;tex.ReadPixels(new Rect(0,0,2000,1200),0,0);tex.Apply();File.WriteAllBytes(Path.Combine(Repo,"AIClient/Assets/Screenshots/partner_skills_overview.png"),tex.EncodeToPNG());}
|
||||
finally{camera.targetTexture=null;RenderTexture.active=old;rt.Release();Object.Destroy(rt);Object.Destroy(tex);}
|
||||
Report("visual",new{status="captured",profiles=10,screenshot="AIClient/Assets/Screenshots/partner_skills_overview.png",sampleSeconds=.14,networkAccountWrites=false});return "Captured ten partner skill signatures";
|
||||
}
|
||||
finally{Object.Destroy(root);}
|
||||
}
|
||||
public static string Finish()
|
||||
{
|
||||
Check(!EditorApplication.isPlaying,"Stop Play first");foreach(string name in new[]{"partner_skills_overview","partner_skills_battle"})AssetDatabase.ImportAsset("Assets/Screenshots/"+name+".png",ImportAssetOptions.ForceUpdate);return "Imported partner skill contact sheet";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Threading.Tasks;
|
||||
using HotUpdate.Gameplay;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEngine.SceneManagement;
|
||||
using UnityEngine;
|
||||
using Object=UnityEngine.Object;
|
||||
|
||||
public static class VerifySkillSlice
|
||||
{
|
||||
const string Prefab="Assets/Bundles/Combat/SkillSlice/SkillSlice.prefab";
|
||||
static string Repo=>Path.GetFullPath(Path.Combine(Application.dataPath,"../.."));
|
||||
static void Check(bool value,string message){if(!value)throw new Exception(message);}
|
||||
static void Report(string name,object value){string folder=Path.Combine(Repo,"Doc/Design/Combat/SkillSlice");Directory.CreateDirectory(folder);File.WriteAllText(Path.Combine(folder,name+".json"),JsonConvert.SerializeObject(value,Formatting.Indented));}
|
||||
public static string Assets()
|
||||
{
|
||||
var prefab=AssetDatabase.LoadAssetAtPath<GameObject>(Prefab);Check(prefab!=null,"Missing review prefab");var player=prefab.GetComponent<SkillSlicePlayer>();Check(player!=null&&player.Views.Length==5,"Five actors required");
|
||||
var so=new SerializedObject(player);Check(so.FindProperty("_trace").objectReferenceValue!=null,"Missing frozen trace");
|
||||
var effects=so.FindProperty("_effects");Check(effects.arraySize==5,"Five effect kinds required");int count=0;
|
||||
for(int i=0;i<5;i++){var slots=effects.GetArrayElementAtIndex(i).FindPropertyRelative("instances");Check(slots.arraySize>=4,"Too few effect slots");for(int n=0;n<slots.arraySize;n++){var ps=(ParticleSystem)slots.GetArrayElementAtIndex(n).objectReferenceValue;Check(ps!=null&&!ps.main.playOnAwake&&ps.main.loop==(i==0||i==1||i==4),"Bad effect lifecycle");count++;}}
|
||||
var clips=so.FindProperty("_clips");Check(clips.arraySize==5,"Five sounds required");for(int i=0;i<5;i++){var clip=(AudioClip)clips.GetArrayElementAtIndex(i).objectReferenceValue;Check(clip!=null&&clip.frequency==44100&&clip.channels==2&&clip.length<1,"Bad skill audio");}
|
||||
Check(so.FindProperty("_voices").arraySize==8,"Voice limit");foreach(var view in player.Views)Check(view.root!=null&&view.muzzle!=null&&view.animator!=null&&!view.animator.applyRootMotion,"Incomplete actor binding");
|
||||
Report("assets",new{status="pass",prefab=Prefab,actors=5,effectKinds=5,poolInstances=count,voices=8,audioClips=5});return "PASS persisted skill slice: five actors, five effects, 24 instances, five clips, eight voices";
|
||||
}
|
||||
public static string Finish()
|
||||
{
|
||||
Check(!EditorApplication.isPlaying,"Stop Play first");
|
||||
foreach(string path in new[]{"enemy_studio_arena","skill_slice_fireball","skill_slice_shield"})AssetDatabase.ImportAsset("Assets/Screenshots/"+path+".png",ImportAssetOptions.ForceUpdate);
|
||||
return "Open scenes: "+string.Join(", ",Enumerable.Range(0,SceneManager.sceneCount).Select(i=>SceneManager.GetSceneAt(i)).Select(s=>s.name+" dirty="+s.isDirty));
|
||||
}
|
||||
static void Final(SkillSlicePlayer p){Check(p.Finished&&p.ConsumedEvents==p.EventCount&&p.FinalStateMatches,"Trace final state mismatch");Check(p.ActiveShots==0&&p.ActiveCharges==0&&p.ActiveShields==0,"Leaked leases at battle end");}
|
||||
static async Task Capture(GameObject root,string name)
|
||||
{
|
||||
var camera=root.GetComponentInChildren<Camera>();var old=RenderTexture.active;var rt=new RenderTexture(1200,1200,24);var tex=new Texture2D(1200,1200,TextureFormat.RGB24,false);
|
||||
try
|
||||
{
|
||||
// Frozen manual-clock snapshots need a particle geometry update before rendering.
|
||||
// Simulates only live root emitters; the authoritative clock/state stay paused.
|
||||
foreach(var ps in root.GetComponentsInChildren<ParticleSystem>().Where(ps=>ps.transform.parent.GetComponent<ParticleSystem>()==null&&(ps.isPlaying||ps.isPaused))) {ps.Simulate(.03f,true,false,true);ps.Pause(true);}
|
||||
Report("particles_"+name,root.GetComponentsInChildren<ParticleSystem>().Where(ps=>ps.particleCount>0).Select(ps=>new{name=ps.name,count=ps.particleCount,position=ps.transform.position.ToString(),bounds=ps.GetComponent<ParticleSystemRenderer>().bounds.ToString(),layer=ps.gameObject.layer}).ToArray());
|
||||
await Task.Delay(50);camera.targetTexture=rt;camera.Render();RenderTexture.active=rt;tex.ReadPixels(new Rect(0,0,1200,1200),0,0);tex.Apply();File.WriteAllBytes(Path.Combine(Repo,"AIClient/Assets/Screenshots/skill_slice_"+name+".png"),tex.EncodeToPNG());
|
||||
}
|
||||
finally{camera.targetTexture=null;RenderTexture.active=old;rt.Release();Object.Destroy(rt);Object.Destroy(tex);}
|
||||
}
|
||||
public static async Task<string> Snapshots()
|
||||
{
|
||||
Check(EditorApplication.isPlaying,"Use Play Mode");var root=Object.Instantiate(AssetDatabase.LoadAssetAtPath<GameObject>(Prefab));root.transform.position=new Vector3(200,0,0);var p=root.GetComponent<SkillSlicePlayer>();
|
||||
try{p.enabled=false;p.Restart();p.Advance(.7f);p.SetPlayback(true,1);await Capture(root,"fireball");p.Restart();p.Advance(1.95f);p.SetPlayback(true,1);await Capture(root,"shield");return "Captured independent skill snapshots";}
|
||||
finally{Object.Destroy(root);}
|
||||
}
|
||||
public static async Task<string> Play()
|
||||
{
|
||||
Check(EditorApplication.isPlaying,"Use Play Mode");bool sfx=PrototypeClientPrefs.Sfx;
|
||||
var root=Object.Instantiate(AssetDatabase.LoadAssetAtPath<GameObject>(Prefab));root.transform.position=new Vector3(200,0,0);var p=root.GetComponent<SkillSlicePlayer>();
|
||||
try
|
||||
{
|
||||
p.enabled=false;p.Restart();
|
||||
Check(p.ActiveCharges==1&&p.ActiveShields==1,"Tick zero should start fire charge and shield");
|
||||
float clock=p.Clock;int consumed=p.ConsumedEvents;p.SetPlayback(true,1);p.Advance(3);Check(p.Clock==clock&&p.ConsumedEvents==consumed,"Pause advanced the simulation");p.SetPlayback(false,1);
|
||||
var trace=JObject.Parse(AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/Bundles/Combat/SkillSlice/trace.json").text);
|
||||
var first=((JArray)trace["events"]).First(e=>(string)e["kind"]=="projectile");float arrival=(int)first["arrival"]*.05f;var target=p.Views.Single(v=>v.id==(int)first["target"]);int hp=target.hp;
|
||||
p.Advance(arrival-.001f);Check(target.hp==hp&&p.ActiveShots>0,"Fireball applied damage before arrival");p.Advance(.002f);Check(target.hp<hp,"Fireball arrival did not apply its trace damage");
|
||||
for(int i=0;i<1000&&!p.Finished;i++)p.Advance(1f/60);Final(p);int count=p.ConsumedEvents;p.Advance(10);Check(p.ConsumedEvents==count,"Finished playback consumed twice");
|
||||
p.Restart();p.SetPlayback(false,2);for(int i=0;i<1000&&!p.Finished;i++)p.Advance(1f/60);Final(p);
|
||||
p.Restart();for(int i=0;i<100&&!p.Finished;i++)p.Advance(.73f);Final(p);
|
||||
PrototypeClientPrefs.Sfx=false;p.Restart();p.Advance(2);Check(p.PlayedSounds==0&&root.GetComponentsInChildren<AudioSource>().All(a=>!a.isPlaying),"Mute ignored");
|
||||
PrototypeClientPrefs.Sfx=true;p.Restart();p.Advance(.3f);Check(p.PlayedSounds>0,"No sound playback");
|
||||
p.enabled=true;root.SetActive(false);Check(p.ActiveShots==0&&p.ActiveCharges==0&&p.ActiveShields==0&&root.GetComponentsInChildren<AudioSource>(true).All(a=>!a.isPlaying),"Disable did not clear resources");
|
||||
root.SetActive(true);p.enabled=false;p.Restart();float middle=((int)first["tick"]+(int)first["arrival"])*.025f;
|
||||
p.Advance(middle);p.SetPlayback(true,1);await Capture(root,"fireball");
|
||||
p.Restart();p.Advance(1.95f);p.SetPlayback(true,1);await Capture(root,"shield");
|
||||
p.enabled=true;p.Restart();
|
||||
bool shot=false,shield=false;var until=DateTime.UtcNow.AddSeconds(20);
|
||||
while(!p.Finished&&DateTime.UtcNow<until)
|
||||
{
|
||||
if(p.ActiveShots>0)shot=true;
|
||||
if(p.Clock>1.9f&&p.ActiveShields>0)shield=true;
|
||||
await Task.Delay(15);
|
||||
}
|
||||
Final(p);Check(shot&&shield&&p.PlayedSounds>0,"Missing live effects");
|
||||
string traceHash;using(var hash=SHA256.Create())traceHash=BitConverter.ToString(hash.ComputeHash(AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/Bundles/Combat/SkillSlice/trace.json").bytes)).Replace("-","").ToLowerInvariant();
|
||||
Report("play",new{status="pass",traceSha256=traceHash,authoritativeCppTrace=true,productionRulesChanged=false,events=p.EventCount,won=p.Won,pause=true,speed2=true,lowFrameRate=true,arrivalDamage=true,finalStateExact=true,mute=true,disableCleanup=true,liveSounds=p.PlayedSounds,fireballScreenshot=shot,shieldScreenshot=shield,networkAccountWrites=false});
|
||||
return "PASS skill slice: arrival-aligned damage, 1x/2x/pause/low-FPS identical final state, mute/cleanup, live VFX/SFX and screenshots";
|
||||
}
|
||||
finally{PrototypeClientPrefs.Sfx=sfx;Object.Destroy(root);}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8e4ea52254689e04bb6e2a96238998dd
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,109 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8af775486e1da0e44afc23efa666546d
|
||||
ModelImporter:
|
||||
serializedVersion: 22200
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 0
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
removeConstantScaleCurves: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 2
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importPhysicalCameras: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
nodeNameCollisionStrategy: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 1
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
optimizeBones: 1
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 0
|
||||
strictVertexDataChecks: 0
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 1
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 0
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
importBlendShapeDeformPercent: 1
|
||||
remapMaterialsIfMaterialImportModeIsNone: 0
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,55 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: BubbleTurtleT2
|
||||
m_Shader: {fileID: 4800000, guid: cab897163f45445fa34263d6670bfc9e, type: 3}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: 774cae4ae9667e44e859d74a12100b8d, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MixTex:
|
||||
m_Texture: {fileID: 2800000, guid: f80b24ca5e30e2a4690b454dc91aa381, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_Lightmaps:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_LightmapsInd:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_ShadowMasks:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _AO: 1
|
||||
- _AlphaTest: 0
|
||||
- _Cutoff: 0.5
|
||||
- _Metallic: 1
|
||||
- _Roughness: 1
|
||||
m_Colors:
|
||||
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 67937f06de13e364d893d2b233e16b7b
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,75 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &1399407832344019213
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications:
|
||||
- target: {fileID: -8679921383154817045, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
propertyPath: m_LocalScale.x
|
||||
value: 0.31835967
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
propertyPath: m_LocalScale.y
|
||||
value: 0.31835967
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
propertyPath: m_LocalScale.z
|
||||
value: 0.31835967
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -7511558181221131132, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
propertyPath: m_Materials.Array.data[0]
|
||||
value:
|
||||
objectReference: {fileID: 2100000, guid: 67937f06de13e364d893d2b233e16b7b, type: 2}
|
||||
- target: {fileID: 919132149155446097, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: BubbleTurtleT2
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: 8af775486e1da0e44afc23efa666546d, type: 3}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a649d9825f03e7e488358926542348ed
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 334 KiB |
@@ -0,0 +1,153 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 774cae4ae9667e44e859d74a12100b8d
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 285 KiB |
@@ -0,0 +1,153 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f80b24ca5e30e2a4690b454dc91aa381
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 0
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,141 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &2326802965310761295
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 8066582526437434499}
|
||||
m_Modifications:
|
||||
- target: {fileID: 1504496391286597350, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
propertyPath: m_LocalScale.x
|
||||
value: 0.33903155
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1504496391286597350, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
propertyPath: m_LocalScale.y
|
||||
value: 0.33903155
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1504496391286597350, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
propertyPath: m_LocalScale.z
|
||||
value: 0.33903155
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1504496391286597350, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: -0.03450233
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1504496391286597350, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0.21282099
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1504496391286597350, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0.19892354
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1504496391286597350, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 0.83484113
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1504496391286597350, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0.55049103
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1504496391286597350, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0.000000024880205
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1504496391286597350, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: -0.00000001640591
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1504496391286597350, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1504496391286597350, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 1504496391286597350, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 2281877863501069404, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: T2Accessory
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
--- !u!4 &3795265130733948841 stripped
|
||||
Transform:
|
||||
m_CorrespondingSourceObject: {fileID: 1504496391286597350, guid: a649d9825f03e7e488358926542348ed, type: 3}
|
||||
m_PrefabInstance: {fileID: 2326802965310761295}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
--- !u!1001 &6472050147524442046
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications:
|
||||
- target: {fileID: 2485982166086068023, guid: 87d292f6b44f8204cba22b3cc492d4c8, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: BubbleTurtle_T2
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6282122223984967218, guid: 87d292f6b44f8204cba22b3cc492d4c8, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6282122223984967218, guid: 87d292f6b44f8204cba22b3cc492d4c8, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6282122223984967218, guid: 87d292f6b44f8204cba22b3cc492d4c8, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6282122223984967218, guid: 87d292f6b44f8204cba22b3cc492d4c8, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6282122223984967218, guid: 87d292f6b44f8204cba22b3cc492d4c8, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6282122223984967218, guid: 87d292f6b44f8204cba22b3cc492d4c8, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6282122223984967218, guid: 87d292f6b44f8204cba22b3cc492d4c8, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6282122223984967218, guid: 87d292f6b44f8204cba22b3cc492d4c8, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6282122223984967218, guid: 87d292f6b44f8204cba22b3cc492d4c8, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6282122223984967218, guid: 87d292f6b44f8204cba22b3cc492d4c8, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects:
|
||||
- targetCorrespondingSourceObject: {fileID: 3900985067594863421, guid: 87d292f6b44f8204cba22b3cc492d4c8, type: 3}
|
||||
insertIndex: -1
|
||||
addedObject: {fileID: 3795265130733948841}
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: 87d292f6b44f8204cba22b3cc492d4c8, type: 3}
|
||||
--- !u!4 &8066582526437434499 stripped
|
||||
Transform:
|
||||
m_CorrespondingSourceObject: {fileID: 3900985067594863421, guid: 87d292f6b44f8204cba22b3cc492d4c8, type: 3}
|
||||
m_PrefabInstance: {fileID: 6472050147524442046}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 18c9a95677dbd2047992454e9a9a2ffa
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 914d620c0defc24489a6ea48944c1ceb
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,109 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cf7f734c411dbeb4aa82ee84cce22a26
|
||||
ModelImporter:
|
||||
serializedVersion: 22200
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 0
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
removeConstantScaleCurves: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 2
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importPhysicalCameras: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
nodeNameCollisionStrategy: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 1
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
optimizeBones: 1
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 0
|
||||
strictVertexDataChecks: 0
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 1
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 0
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
importBlendShapeDeformPercent: 1
|
||||
remapMaterialsIfMaterialImportModeIsNone: 0
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,55 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: BubbleTurtleStudio
|
||||
m_Shader: {fileID: 4800000, guid: cab897163f45445fa34263d6670bfc9e, type: 3}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: c04fdfecfe7da494e98ca8455c1bc277, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MixTex:
|
||||
m_Texture: {fileID: 2800000, guid: 42a87282bf6b2534c95d79ba84cf6d18, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_Lightmaps:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_LightmapsInd:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_ShadowMasks:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _AO: 1
|
||||
- _AlphaTest: 0
|
||||
- _Cutoff: 0.5
|
||||
- _Metallic: 1
|
||||
- _Roughness: 1
|
||||
m_Colors:
|
||||
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 783834196032caa449de33939ba9db40
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,75 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &2981637342065222045
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications:
|
||||
- target: {fileID: -8679921383154817045, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
propertyPath: m_LocalScale.x
|
||||
value: 0.6655939
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
propertyPath: m_LocalScale.y
|
||||
value: 0.6655939
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
propertyPath: m_LocalScale.z
|
||||
value: 0.6655939
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -7511558181221131132, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
propertyPath: m_Materials.Array.data[0]
|
||||
value:
|
||||
objectReference: {fileID: 2100000, guid: 783834196032caa449de33939ba9db40, type: 2}
|
||||
- target: {fileID: 919132149155446097, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: BubbleTurtleStudio
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: cf7f734c411dbeb4aa82ee84cce22a26, type: 3}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 440df5ab60cc0ca4889159579bc56e8f
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,128 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &3141654165413714151
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 6226229397288864639}
|
||||
m_Layer: 0
|
||||
m_Name: BubbleTurtleStudio_Companion
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &6226229397288864639
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3141654165413714151}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 2273241566516042268}
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1001 &1731234196919827959
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 6226229397288864639}
|
||||
m_Modifications:
|
||||
- target: {fileID: -8679921383154817045, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_LocalScale.x
|
||||
value: 0.6617885
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_LocalScale.y
|
||||
value: 0.6617885
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_LocalScale.z
|
||||
value: 0.6617885
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: 0.00000003944567
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0.000000059168507
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: -0.00000007889134
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 919132149155446097, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: Model
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4504519800477438933, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_UpdateWhenOffscreen
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 4504519800477438933, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_Materials.Array.data[0]
|
||||
value:
|
||||
objectReference: {fileID: 2100000, guid: 783834196032caa449de33939ba9db40, type: 2}
|
||||
- target: {fileID: 5866666021909216657, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_Avatar
|
||||
value:
|
||||
objectReference: {fileID: 9000000, guid: e724233c3fa15644d9c38a98751380eb, type: 3}
|
||||
- target: {fileID: 5866666021909216657, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_Controller
|
||||
value:
|
||||
objectReference: {fileID: 9100000, guid: 95d22e08afcf1084086f8b522e856761, type: 2}
|
||||
- target: {fileID: 5866666021909216657, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
propertyPath: m_CullingMode
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
--- !u!4 &2273241566516042268 stripped
|
||||
Transform:
|
||||
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 6580d391cbc942b488dfe3802968b6d0, type: 3}
|
||||
m_PrefabInstance: {fileID: 1731234196919827959}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6989c779790eba44e9e0ab938f445cef
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 1.3 MiB |
@@ -0,0 +1,153 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c04fdfecfe7da494e98ca8455c1bc277
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 1.0 MiB |
@@ -0,0 +1,153 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 42a87282bf6b2534c95d79ba84cf6d18
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 0
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f507823459bc6da418734000e45446dd
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,109 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6580d391cbc942b488dfe3802968b6d0
|
||||
ModelImporter:
|
||||
serializedVersion: 22200
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 0
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
removeConstantScaleCurves: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 0
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importPhysicalCameras: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
nodeNameCollisionStrategy: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 1
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
optimizeBones: 1
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 0
|
||||
strictVertexDataChecks: 0
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 0
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 1
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
importBlendShapeDeformPercent: 1
|
||||
remapMaterialsIfMaterialImportModeIsNone: 0
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c96700e9aaf9fca4aa08228defe8cb44
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,109 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0fbb084709be9a64ba61ec34a4c47a8f
|
||||
ModelImporter:
|
||||
serializedVersion: 22200
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 0
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
removeConstantScaleCurves: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 2
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importPhysicalCameras: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
nodeNameCollisionStrategy: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 1
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
optimizeBones: 1
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 0
|
||||
strictVertexDataChecks: 0
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 1
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 0
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
importBlendShapeDeformPercent: 1
|
||||
remapMaterialsIfMaterialImportModeIsNone: 0
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,55 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: BudBudT2
|
||||
m_Shader: {fileID: 4800000, guid: cab897163f45445fa34263d6670bfc9e, type: 3}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: 6841c6e3216054c43ac62bcbd988a6d4, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MixTex:
|
||||
m_Texture: {fileID: 2800000, guid: f6664da9d2e5fc94896c29a734ea185a, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_Lightmaps:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_LightmapsInd:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_ShadowMasks:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _AO: 1
|
||||
- _AlphaTest: 0
|
||||
- _Cutoff: 0.5
|
||||
- _Metallic: 1
|
||||
- _Roughness: 1
|
||||
m_Colors:
|
||||
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b05ccabb380fe3646abba731b5492e60
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,75 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &7259353964875309797
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications:
|
||||
- target: {fileID: -8679921383154817045, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
propertyPath: m_LocalScale.x
|
||||
value: 0.19539677
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
propertyPath: m_LocalScale.y
|
||||
value: 0.19539677
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
propertyPath: m_LocalScale.z
|
||||
value: 0.19539677
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -7511558181221131132, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
propertyPath: m_Materials.Array.data[0]
|
||||
value:
|
||||
objectReference: {fileID: 2100000, guid: b05ccabb380fe3646abba731b5492e60, type: 2}
|
||||
- target: {fileID: 919132149155446097, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: BudBudT2
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: 0fbb084709be9a64ba61ec34a4c47a8f, type: 3}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 01a7d7d7ea78467498e2a6cf8de2bdb0
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 458 KiB |
@@ -0,0 +1,153 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6841c6e3216054c43ac62bcbd988a6d4
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 341 KiB |
@@ -0,0 +1,153 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f6664da9d2e5fc94896c29a734ea185a
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 0
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,141 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &7471398000357897724
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 5302248845328929276}
|
||||
m_Modifications:
|
||||
- target: {fileID: 7148583172858053902, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
propertyPath: m_LocalScale.x
|
||||
value: 0.39774323
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7148583172858053902, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
propertyPath: m_LocalScale.y
|
||||
value: 0.39774343
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7148583172858053902, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
propertyPath: m_LocalScale.z
|
||||
value: 0.39774343
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7148583172858053902, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: -0.024363441
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7148583172858053902, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0.6216763
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7148583172858053902, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0.035148177
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7148583172858053902, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 0.9923165
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7148583172858053902, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: -0.114133194
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7148583172858053902, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: -0.0337763
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7148583172858053902, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0.03377628
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7148583172858053902, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7148583172858053902, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7148583172858053902, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 7529752674518589364, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: T2Accessory
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
--- !u!4 &331967162861187314 stripped
|
||||
Transform:
|
||||
m_CorrespondingSourceObject: {fileID: 7148583172858053902, guid: 01a7d7d7ea78467498e2a6cf8de2bdb0, type: 3}
|
||||
m_PrefabInstance: {fileID: 7471398000357897724}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
--- !u!1001 &8234954176641341189
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications:
|
||||
- target: {fileID: 1887883922811914342, guid: 80edfecf447868c49b8acae96fc28b25, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: BudBud_T2
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3018079432363454862, guid: 80edfecf447868c49b8acae96fc28b25, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3018079432363454862, guid: 80edfecf447868c49b8acae96fc28b25, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3018079432363454862, guid: 80edfecf447868c49b8acae96fc28b25, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3018079432363454862, guid: 80edfecf447868c49b8acae96fc28b25, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3018079432363454862, guid: 80edfecf447868c49b8acae96fc28b25, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3018079432363454862, guid: 80edfecf447868c49b8acae96fc28b25, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3018079432363454862, guid: 80edfecf447868c49b8acae96fc28b25, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3018079432363454862, guid: 80edfecf447868c49b8acae96fc28b25, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3018079432363454862, guid: 80edfecf447868c49b8acae96fc28b25, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3018079432363454862, guid: 80edfecf447868c49b8acae96fc28b25, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects:
|
||||
- targetCorrespondingSourceObject: {fileID: 4313656837881579257, guid: 80edfecf447868c49b8acae96fc28b25, type: 3}
|
||||
insertIndex: -1
|
||||
addedObject: {fileID: 331967162861187314}
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: 80edfecf447868c49b8acae96fc28b25, type: 3}
|
||||
--- !u!4 &5302248845328929276 stripped
|
||||
Transform:
|
||||
m_CorrespondingSourceObject: {fileID: 4313656837881579257, guid: 80edfecf447868c49b8acae96fc28b25, type: 3}
|
||||
m_PrefabInstance: {fileID: 8234954176641341189}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 36df24ff30a17254e8e86c11600fc014
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2c4a31f48fb76174eac8b944c05d8637
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,109 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cad3fc5095e77764b88c5e028b7dd760
|
||||
ModelImporter:
|
||||
serializedVersion: 22200
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 2
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
removeConstantScaleCurves: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 2
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importPhysicalCameras: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
nodeNameCollisionStrategy: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 1
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
optimizeBones: 1
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 0
|
||||
strictVertexDataChecks: 0
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 1
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 0
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
importBlendShapeDeformPercent: 1
|
||||
remapMaterialsIfMaterialImportModeIsNone: 0
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,55 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: BudBudStudio
|
||||
m_Shader: {fileID: 4800000, guid: cab897163f45445fa34263d6670bfc9e, type: 3}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: 1153945ccdcc77e46848080960d66cc6, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MixTex:
|
||||
m_Texture: {fileID: 2800000, guid: b242288ddd1cef94ea0ebc4e00008198, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_Lightmaps:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_LightmapsInd:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_ShadowMasks:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _AO: 1
|
||||
- _AlphaTest: 0
|
||||
- _Cutoff: 0.5
|
||||
- _Metallic: 1
|
||||
- _Roughness: 1
|
||||
m_Colors:
|
||||
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 89b3481675d7d784ba005fabcec10866
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,75 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &4210571181891406456
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications:
|
||||
- target: {fileID: -8679921383154817045, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
propertyPath: m_LocalScale.x
|
||||
value: 0.4420027
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
propertyPath: m_LocalScale.y
|
||||
value: 0.4420027
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
propertyPath: m_LocalScale.z
|
||||
value: 0.4420027
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -7511558181221131132, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
propertyPath: m_Materials.Array.data[0]
|
||||
value:
|
||||
objectReference: {fileID: 2100000, guid: 89b3481675d7d784ba005fabcec10866, type: 2}
|
||||
- target: {fileID: 919132149155446097, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: BudBudStudio
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: cad3fc5095e77764b88c5e028b7dd760, type: 3}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6dd81435a4bf1b24fade39ec963c595b
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,128 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &1887883922811914342
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 3018079432363454862}
|
||||
m_Layer: 0
|
||||
m_Name: BudBudStudio_Companion
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &3018079432363454862
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1887883922811914342}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 3453400434817649373}
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1001 &2911093491935292726
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 3018079432363454862}
|
||||
m_Modifications:
|
||||
- target: {fileID: -8679921383154817045, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_LocalScale.x
|
||||
value: 0.44205198
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_LocalScale.y
|
||||
value: 0.44205198
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_LocalScale.z
|
||||
value: 0.44205198
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: -0.0070299506
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: -0.000000026348351
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0.002293848
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 603565853814607124, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_UpdateWhenOffscreen
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 603565853814607124, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_Materials.Array.data[0]
|
||||
value:
|
||||
objectReference: {fileID: 2100000, guid: 89b3481675d7d784ba005fabcec10866, type: 2}
|
||||
- target: {fileID: 919132149155446097, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: Model
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 5866666021909216657, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_Avatar
|
||||
value:
|
||||
objectReference: {fileID: 9000000, guid: bf3067dd73127404592fc58d310d660c, type: 3}
|
||||
- target: {fileID: 5866666021909216657, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_Controller
|
||||
value:
|
||||
objectReference: {fileID: 9100000, guid: a45c5a3db232aaf4db290da557d604cf, type: 2}
|
||||
- target: {fileID: 5866666021909216657, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
propertyPath: m_CullingMode
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
--- !u!4 &3453400434817649373 stripped
|
||||
Transform:
|
||||
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: e9180903f7cc75b40b7991f5b48bae0a, type: 3}
|
||||
m_PrefabInstance: {fileID: 2911093491935292726}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 80edfecf447868c49b8acae96fc28b25
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 1.5 MiB |
@@ -0,0 +1,153 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1153945ccdcc77e46848080960d66cc6
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 1.0 MiB |
@@ -0,0 +1,153 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b242288ddd1cef94ea0ebc4e00008198
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 0
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 712eae0726ed7c042955a65d5270de88
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,109 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e9180903f7cc75b40b7991f5b48bae0a
|
||||
ModelImporter:
|
||||
serializedVersion: 22200
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 0
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
removeConstantScaleCurves: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 0
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importPhysicalCameras: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
nodeNameCollisionStrategy: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 1
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
optimizeBones: 1
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 0
|
||||
strictVertexDataChecks: 0
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 0
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 1
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
importBlendShapeDeformPercent: 1
|
||||
remapMaterialsIfMaterialImportModeIsNone: 0
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 29296708591998f46b3667e6716ea435
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,109 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cfbf976ee3f71384392abe9f618d3134
|
||||
ModelImporter:
|
||||
serializedVersion: 22200
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 0
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
removeConstantScaleCurves: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 2
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importPhysicalCameras: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
nodeNameCollisionStrategy: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 1
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
optimizeBones: 1
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 0
|
||||
strictVertexDataChecks: 0
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 1
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 0
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
importBlendShapeDeformPercent: 1
|
||||
remapMaterialsIfMaterialImportModeIsNone: 0
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,55 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: FireCatT2
|
||||
m_Shader: {fileID: 4800000, guid: cab897163f45445fa34263d6670bfc9e, type: 3}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: 481ab89451b96d342bb2b8a073142369, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MixTex:
|
||||
m_Texture: {fileID: 2800000, guid: a9b0e841b7a5e81458eaf31f319d8639, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_Lightmaps:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_LightmapsInd:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_ShadowMasks:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _AO: 1
|
||||
- _AlphaTest: 0
|
||||
- _Cutoff: 0.5
|
||||
- _Metallic: 1
|
||||
- _Roughness: 1
|
||||
m_Colors:
|
||||
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 801c539bb89184d4db705d5442ba72b3
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,75 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &3346510364984863504
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications:
|
||||
- target: {fileID: -8679921383154817045, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
propertyPath: m_LocalScale.x
|
||||
value: 0.16613798
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
propertyPath: m_LocalScale.y
|
||||
value: 0.16613798
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
propertyPath: m_LocalScale.z
|
||||
value: 0.16613798
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -7511558181221131132, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
propertyPath: m_Materials.Array.data[0]
|
||||
value:
|
||||
objectReference: {fileID: 2100000, guid: 801c539bb89184d4db705d5442ba72b3, type: 2}
|
||||
- target: {fileID: 919132149155446097, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: FireCatT2
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: cfbf976ee3f71384392abe9f618d3134, type: 3}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 18662307430b9064b95e4a75791c7521
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 332 KiB |
@@ -0,0 +1,153 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 481ab89451b96d342bb2b8a073142369
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 304 KiB |
@@ -0,0 +1,153 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a9b0e841b7a5e81458eaf31f319d8639
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 0
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 3
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 3
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,141 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &6063066166673178595
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 3289868426428585961}
|
||||
m_Modifications:
|
||||
- target: {fileID: 2499595253013075521, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: T2Accessory
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3025161173665877243, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
propertyPath: m_LocalScale.x
|
||||
value: 0.44182476
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3025161173665877243, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
propertyPath: m_LocalScale.y
|
||||
value: 0.44182488
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3025161173665877243, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
propertyPath: m_LocalScale.z
|
||||
value: 0.44182482
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3025161173665877243, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: -0.012323457
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3025161173665877243, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0.34565732
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3025161173665877243, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0.06718549
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3025161173665877243, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 0.9981818
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3025161173665877243, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: -0.060275167
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3025161173665877243, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0.0000000409037
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3025161173665877243, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0.0000000024699744
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3025161173665877243, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3025161173665877243, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 3025161173665877243, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
--- !u!4 &9070212820759933720 stripped
|
||||
Transform:
|
||||
m_CorrespondingSourceObject: {fileID: 3025161173665877243, guid: 18662307430b9064b95e4a75791c7521, type: 3}
|
||||
m_PrefabInstance: {fileID: 6063066166673178595}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
--- !u!1001 &8611426257845666933
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications:
|
||||
- target: {fileID: 141938960746356088, guid: d65e53b28246dce4fbfb60cfb483a63c, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: FireCat_T2
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6859823183142433732, guid: d65e53b28246dce4fbfb60cfb483a63c, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6859823183142433732, guid: d65e53b28246dce4fbfb60cfb483a63c, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6859823183142433732, guid: d65e53b28246dce4fbfb60cfb483a63c, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6859823183142433732, guid: d65e53b28246dce4fbfb60cfb483a63c, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6859823183142433732, guid: d65e53b28246dce4fbfb60cfb483a63c, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6859823183142433732, guid: d65e53b28246dce4fbfb60cfb483a63c, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6859823183142433732, guid: d65e53b28246dce4fbfb60cfb483a63c, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6859823183142433732, guid: d65e53b28246dce4fbfb60cfb483a63c, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6859823183142433732, guid: d65e53b28246dce4fbfb60cfb483a63c, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6859823183142433732, guid: d65e53b28246dce4fbfb60cfb483a63c, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects:
|
||||
- targetCorrespondingSourceObject: {fileID: 6495909650973610908, guid: d65e53b28246dce4fbfb60cfb483a63c, type: 3}
|
||||
insertIndex: -1
|
||||
addedObject: {fileID: 9070212820759933720}
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: d65e53b28246dce4fbfb60cfb483a63c, type: 3}
|
||||
--- !u!4 &3289868426428585961 stripped
|
||||
Transform:
|
||||
m_CorrespondingSourceObject: {fileID: 6495909650973610908, guid: d65e53b28246dce4fbfb60cfb483a63c, type: 3}
|
||||
m_PrefabInstance: {fileID: 8611426257845666933}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cbecbf35f2727a64d9d7867322d97888
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1eb652b6d8a93a242936cac83d6adfd0
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,109 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ddbdb8b52d825a6468ab129c74f187ad
|
||||
ModelImporter:
|
||||
serializedVersion: 22200
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
materials:
|
||||
materialImportMode: 2
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
materialLocation: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleCurves: 1
|
||||
optimizeGameObjects: 0
|
||||
removeConstantScaleCurves: 0
|
||||
motionNodeName:
|
||||
rigImportErrors:
|
||||
rigImportWarnings:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
importAnimatedCustomProperties: 0
|
||||
importConstraints: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
extraUserProperties: []
|
||||
clipAnimations: []
|
||||
isReadable: 0
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 2
|
||||
addColliders: 0
|
||||
useSRGBMaterialColor: 1
|
||||
sortHierarchyByName: 1
|
||||
importPhysicalCameras: 1
|
||||
importVisibility: 1
|
||||
importBlendShapes: 1
|
||||
importCameras: 1
|
||||
importLights: 1
|
||||
nodeNameCollisionStrategy: 1
|
||||
fileIdsGeneration: 2
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
bakeAxisConversion: 1
|
||||
preserveHierarchy: 0
|
||||
skinWeightsMode: 0
|
||||
maxBonesPerVertex: 4
|
||||
minBoneWeight: 0.001
|
||||
optimizeBones: 1
|
||||
meshOptimizationFlags: -1
|
||||
indexFormat: 0
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVMarginMethod: 1
|
||||
secondaryUVMinLightmapResolution: 40
|
||||
secondaryUVMinObjectScale: 1
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 0
|
||||
strictVertexDataChecks: 0
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
normalCalculationMode: 4
|
||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
||||
blendShapeNormalImportMode: 1
|
||||
normalSmoothingSource: 0
|
||||
referencedClips: []
|
||||
importAnimation: 1
|
||||
humanDescription:
|
||||
serializedVersion: 3
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
globalScale: 1
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
hasExtraRoot: 0
|
||||
skeletonHasParents: 1
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
autoGenerateAvatarMappingIfUnspecified: 1
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
avatarSetup: 0
|
||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
||||
importBlendShapeDeformPercent: 1
|
||||
remapMaterialsIfMaterialImportModeIsNone: 0
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,55 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: FireCatStudio
|
||||
m_Shader: {fileID: 4800000, guid: cab897163f45445fa34263d6670bfc9e, type: 3}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: 377128352d52e884d964f8ed55fe2839, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MixTex:
|
||||
m_Texture: {fileID: 2800000, guid: edb81e6ceb0e4964197891ed0044c41b, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_Lightmaps:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_LightmapsInd:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- unity_ShadowMasks:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _AO: 1
|
||||
- _AlphaTest: 0
|
||||
- _Cutoff: 0.5
|
||||
- _Metallic: 1
|
||||
- _Roughness: 1
|
||||
m_Colors:
|
||||
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ecce75590b26fe84c8ecc4b6b4bce742
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,75 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &1584038190579633656
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications:
|
||||
- target: {fileID: -8679921383154817045, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
propertyPath: m_LocalScale.x
|
||||
value: 0.5517599
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
propertyPath: m_LocalScale.y
|
||||
value: 0.5517599
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
propertyPath: m_LocalScale.z
|
||||
value: 0.5517599
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -7511558181221131132, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
propertyPath: m_Materials.Array.data[0]
|
||||
value:
|
||||
objectReference: {fileID: 2100000, guid: ecce75590b26fe84c8ecc4b6b4bce742, type: 2}
|
||||
- target: {fileID: 919132149155446097, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: FireCatStudio
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: ddbdb8b52d825a6468ab129c74f187ad, type: 3}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 13b2e485132e2f64a922c4ce1402b84c
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,128 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &141938960746356088
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 6859823183142433732}
|
||||
m_Layer: 0
|
||||
m_Name: FireCatStudio_Companion
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &6859823183142433732
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 141938960746356088}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 5627205975505231800}
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1001 &5304505304255084627
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
serializedVersion: 3
|
||||
m_TransformParent: {fileID: 6859823183142433732}
|
||||
m_Modifications:
|
||||
- target: {fileID: -8679921383154817045, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_LocalScale.x
|
||||
value: 0.55149025
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_LocalScale.y
|
||||
value: 0.55149025
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_LocalScale.z
|
||||
value: 0.55149025
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: -0.010847818
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0.00000004930707
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: -0.0032732992
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_LocalRotation.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -8679921383154817045, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_LocalEulerAnglesHint.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -2435146115520677018, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_UpdateWhenOffscreen
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: -2435146115520677018, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_Materials.Array.data[0]
|
||||
value:
|
||||
objectReference: {fileID: 2100000, guid: ecce75590b26fe84c8ecc4b6b4bce742, type: 2}
|
||||
- target: {fileID: 919132149155446097, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_Name
|
||||
value: Model
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 5866666021909216657, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_Avatar
|
||||
value:
|
||||
objectReference: {fileID: 9000000, guid: 0088e4ecc0514ef4fb02e23c984f97a9, type: 3}
|
||||
- target: {fileID: 5866666021909216657, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_Controller
|
||||
value:
|
||||
objectReference: {fileID: 9100000, guid: 929c16a74f4414a408d223cde8a9f024, type: 2}
|
||||
- target: {fileID: 5866666021909216657, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
propertyPath: m_CullingMode
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_SourcePrefab: {fileID: 100100000, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
--- !u!4 &5627205975505231800 stripped
|
||||
Transform:
|
||||
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 3e02243339a382f418af42f8c01d6ae0, type: 3}
|
||||
m_PrefabInstance: {fileID: 5304505304255084627}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d65e53b28246dce4fbfb60cfb483a63c
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 1.5 MiB |