private void InitEscapePointGuiders() { //TODO: refactor as object pool. for (int i = 0; i < LevelGenerator.Instance.EscapeWreckageList.Count; i++) { BaseWreckage wreckage = LevelGenerator.Instance.EscapeWreckageList[i]; Transform guideOrigin = CameraManager.Instance.FollowController.transform; Transform guideTarget = wreckage.StopPoint.transform;; SpecialPointGuider guider = SpecialPointGuider.Create (this, "__EscapePointGuider__", guideTarget, guideOrigin, transform); guider.Config("PositionOutsideGuider", "PositionInsideGuider"); guider.Active = true; wreckage.Guider = guider; EscapePointGuiderList_.Add(guider); } }
public IEnumerator DoLandingAction(Action callback = null) { Debugger.Log("DoLandingAction: " + Time.frameCount); CurrentRole.PlayAnimation(Role.AnimState.Ready_To_Standard); if (LevelGenerator.Instance.CurrentWreckage == null) { Debugger.LogError("DoLandingAction(), target Wreckage is null!"); yield break; } BaseWreckage currentWreckage = LevelGenerator.Instance.CurrentWreckage; StartCoroutine(CorrectFace(currentWreckage.transform)); Vector3 landedPoint = currentWreckage.StopPoint.transform.position; RaycastHit[] hits; hits = Physics.RaycastAll(transform.position, -currentWreckage.transform.up, 10f); if (hits.Length != 0) { for (int i = 0; i < hits.Length; i++) { if (hits[i].transform.parent.name == Level.BLOCKED_ROOT_NAME) { landedPoint = hits[i].point; break; } } } yield return(StartCoroutine(LandMove(landedPoint))); yield return(StartCoroutine(LandedCameraAnim())); OnLandedAnimationFinished(); if (callback != null) { callback(); } }
private void InitWreckage(Transform parent, WreckageInfo info) { string modelPath = info.ModelName; GameObject prefab = AssetBundleLoader.Instance.GetAsset(AssetType.Model, modelPath) as GameObject; GameObject root = new GameObject(); root.name = string.Format("wreckage_({0})_{1}", root.GetInstanceID(), info.Type); root.transform.SetParent(parent); root.transform.localPosition = info.Position; root.transform.localEulerAngles = info.Face; GameObject instance = Utility.CommonInstantiate(prefab, root.transform); if (instance == null) { Debug.LogError("InitWreckage(), failed!"); return; } Collider srcCollider = instance.GetComponent <Collider>(); AttachCollider(root, srcCollider); Destroy(srcCollider); //不能着陆的区域碰撞检测 Transform blockedTransRoot = instance.transform.FindChild(BLOCKED_ROOT_NAME); if (blockedTransRoot) { for (int i = 0; i < blockedTransRoot.childCount; i++) { Transform trans = blockedTransRoot.GetChild(i); trans.gameObject.AddComponent <WreckageBlock>(); } } else { Debugger.LogErrorFormat("不能着陆的区域碰撞检测的根节点未找到, {0}", name); } BaseWreckage wreckage = AddScriptByWreckageType(info.Type, root); wreckage.StopPoint = InitStopPoint(root.transform, info); if (info.Nodetype == WreckageInfo.NodeType.Birth) { BirthWreckage = wreckage; } else if (info.Nodetype == WreckageInfo.NodeType.Escape) { wreckage.IsEscape = true; LevelGenerator.Instance.EscapeWreckageList.Add(wreckage); Debugger.Log("Is escape: " + root.name); } else { } List <Vector3> sourceGenPos = GetSourcePointList(info.SourcePointList, info.SourceInfoList.Length); Debugger.Assert(sourceGenPos.Count == info.SourceInfoList.Length, "资源点位置数量与资源点数量不一致!"); List <BaseSource> sourcePosList = new List <BaseSource>(); for (int i = 0; i < info.SourceInfoList.Length; i++) { BaseSource source = InitSourcePoints(root.transform, info.SourceInfoList[i], sourceGenPos[i]); sourcePosList.Add(source); } wreckage.SourcePointList = sourcePosList; }