public static async System.Threading.Tasks.Task <GPrefab> CreatePrefab(List <GActor> actors, bool firstCoord = false) { GPrefab result = null; if (actors.Count == 1) { result = await actors[0].ConvertToPrefab(CEngine.Instance.RenderContext); } else { result = new GPrefab(); result.ActorId = Guid.NewGuid(); var placement = new GamePlay.Component.GPlacementComponent(); result.Placement = placement; for (int i = 0; i < actors.Count; ++i) { if (actors[i] is GPrefab) { var prefab = actors[i] as GPrefab; var actor = await prefab.ConvertToActor(CEngine.Instance.RenderContext); actor.SetParent(result, false); } else { actors[i].SetParent(result, false); } } } return(result); }
public async override System.Threading.Tasks.Task <GActor> Clone(CRenderContext rc) { var result = new GPrefab(); //var result = new GCloneActor(); var init = Initializer.CloneObject() as GActorInitializer; init.ActorId = Guid.NewGuid(); result.SetInitializer(init); if (CenterData != null) { Rtti.MetaClass.CopyData(CenterData, result.CenterData); } for (int i = 0; i < Components.Count; ++i) { var comp = await Components[i]?.CloneComponent(rc, result, result); result.AddComponent(comp); } for (int i = 0; i < Children.Count; ++i) { var actor = await Children[i].Clone(rc); actor.SetParent(result); actor.OnActorLoaded(); } result.OnActorLoaded(); result.OnPlacementChanged(result.Placement); result.WaitContext.Result = result; result.WaitContext.SetFinished(WaitContext.IsFinished); return(result); }
public async System.Threading.Tasks.Task <GActor> GetPrefabFistChild(CRenderContext rc, RName name, bool clone = false) { GPrefab result; bool found = false; lock (Prefabs) { if (Prefabs.TryGetValue(name, out result) == false) { result = new GPrefab(); Prefabs.Add(name, result); } else { found = true; } } if (found) { await result.AwaitLoad(); if (clone) { GActor cloneprefab = await result.Children[0].Clone(EngineNS.CEngine.Instance.RenderContext); //cloneprefab.Placement.Transform = cloneprefab.Placement.Transform * result.Placement.Transform; return(cloneprefab); } return(result.Children[0]); } var xnd = await IO.XndHolder.LoadXND(name.Address); if (xnd == null) { Profiler.Log.WriteLine(Profiler.ELogTag.Error, "IO", "Prefab RName error!"); return(null); } if (false == await result.LoadXnd(rc, xnd.Node)) { xnd.Node.TryReleaseHolder(); return(null); } xnd.Node.TryReleaseHolder(); result.Name = name; if (clone) { GActor cloneprefab = await result.Children[0].Clone(EngineNS.CEngine.Instance.RenderContext); //cloneprefab.Placement.Transform = cloneprefab.Placement.Transform * result.Placement.Transform; return(cloneprefab); } return(result.Children[0]); }
public async System.Threading.Tasks.Task <GPrefab> GetPrefab(CRenderContext rc, RName name, bool clone = false) { GPrefab result; bool found = false; lock (Prefabs) { if (Prefabs.TryGetValue(name, out result) == false) { result = new GPrefab(); Prefabs.Add(name, result); } else { found = true; } } if (found) { await result.AwaitLoad(); if (clone) { GPrefab cloneprefab = await result.Clone(EngineNS.CEngine.Instance.RenderContext) as GPrefab; //cloneprefab.Placement.Transform = cloneprefab.Placement.Transform * result.Placement.Transform; return(cloneprefab); } return(result); } var xnd = await IO.XndHolder.LoadXND(name.Address); if (xnd == null) { Profiler.Log.WriteLine(Profiler.ELogTag.Error, "IO", "Prefab RName error!"); return(null); } if (false == await result.LoadXnd(rc, xnd.Node)) { xnd.Node.TryReleaseHolder(); return(null); } xnd.Node.TryReleaseHolder(); result.Name = name; ///兼容以前的没有名字的prefab if (string.IsNullOrEmpty(result.SpecialName) && result.Children.Count == 0) { result.SpecialName = $"Prefab"; } if (string.IsNullOrEmpty(result.SpecialName) && result.Children.Count > 0) { result.SpecialName = $"Prefab_{result.Children[0].SpecialName}"; } /////兼容以前的没有名字的prefab //if (result.Children.Count == 1) //{ // result = await result.Children[0].ConvertToPrefab(EngineNS.CEngine.Instance.RenderContext); // Prefabs[name] = result; //} if (clone) { GPrefab cloneprefab = await result.Clone(EngineNS.CEngine.Instance.RenderContext) as GPrefab; //cloneprefab.Placement.Transform = cloneprefab.Placement.Transform * result.Placement.Transform; return(cloneprefab); } return(result); }