예제 #1
0
 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);
     }
 }
예제 #2
0
    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();
        }
    }
예제 #3
0
    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;
    }