Пример #1
0
    /// <summary>
    /// OnTriggerExit is called when the Collider other has stopped touching the trigger.
    /// </summary>
    /// <param name="other">The other Collider involved in this collision.</param>
    void OnTriggerExit(Collider other)
    {
        var tmp = other.GetComponent <TriggerTeleport>();

        if (tmp != null && tmp == teleport)
        {
            teleport = null;
        }
    }
Пример #2
0
    /// <summary>
    /// OnTriggerEnter is called when the Collider other enters the trigger.
    /// </summary>
    /// <param name="other">The other Collider involved in this collision.</param>
    void OnTriggerEnter(Collider other)
    {
        var tmp = other.GetComponent <TriggerTeleport>();

        if (tmp != null)
        {
            teleport             = tmp;
            teleport.curCollider = other as BoxCollider;
        }
    }
Пример #3
0
    static void RenderBoxGizmo(TriggerTeleport teleport, GizmoType gizmoType)
    {
        if (!EditorApplication.isPlaying)
        {
        }

        var color = s_HandleColor;

        if (!teleport.enabled)
        {
            color = s_HandleColorDisabled;
        }
        if (teleport.trigger == null)
        {
            teleport.trigger = teleport.GetComponent <BoxCollider>();
        }

        var oldColor  = Gizmos.color;
        var oldMatrix = Gizmos.matrix;

        Gizmos.matrix = UnScaledLocalToWorldMatrix(teleport.transform);
        Gizmos.color  = color;
        DrawTeleport(teleport);
    }
Пример #4
0
 static void DrawTeleport(TriggerTeleport teleport)
 {
     Handles.DrawLine(teleport.transform.localToWorldMatrix.MultiplyPoint(teleport.trigger.center), teleport.transform.localToWorldMatrix.MultiplyPoint(teleport.destPos));
 }
Пример #5
0
        public static GameObject Instantiate(ENTITY e)
        {
            GameObject entityObject;

            switch (e.Classname)
            {
            case "action_animate":
            {
                entityObject = AnimateAction.Instantiate(e);
                break;
            }

            case "action_move":
            {
                entityObject = MoveAction.Instantiate(e);
                break;
            }

            case "action_rotate":
            {
                entityObject = RotateAction.Instantiate(e);
                break;
            }

            case "action_sequence":
            {
                entityObject = ActionSequence.Instantiate(e);
                break;
            }

            case "action_sound":
            {
                entityObject = SoundAction.Instantiate(e);
                break;
            }

            case "action_wait":
            {
                entityObject = WaitAction.Instantiate(e);
                break;
            }

            case "audio_source":
            {
                entityObject = AudioSourceObject.Instantiate(e);
                break;
            }

            case "dream_environment":
            {
                entityObject = DreamEnvironment.Instantiate(e);
                break;
            }

            case "!map":
            {
                entityObject = MapObject.Instantiate(e);
                break;
            }

            case "!model":
            {
                entityObject = ModelObject.Instantiate(e);
                break;
            }

            case "music_controller":
            {
                entityObject = MusicController.Instantiate(e);
                break;
            }

            case "player_spawn":
            {
                entityObject = PlayerSpawn.Instantiate(e);
                break;
            }

            case "target":
            {
                entityObject = Target.Instantiate(e);
                break;
            }

            case "trigger_link":
            {
                entityObject = TriggerLink.Instantiate(e);
                break;
            }

            case "trigger_sequence":
            {
                entityObject = TriggerSequence.Instantiate(e);
                break;
            }

            case "trigger_sound":
            {
                entityObject = TriggerSound.Instantiate(e);
                break;
            }

            case "trigger_teleport":
            {
                entityObject = TriggerTeleport.Instantiate(e);
                break;
            }

            default:
            {
                Debug.LogWarning("Could not instantiate entity with classname " + e.Classname);
                entityObject = new GameObject(e.Classname);
                break;
            }
            }

            return(entityObject);
        }
Пример #6
0
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.LeftArrow))         //左
        {
            agent.Move(Vector3.left * speed.z);
        }
        else if (Input.GetKey(KeyCode.UpArrow))
        {
            agent.Move(Vector3.back * speed.z);
        }
        else if (Input.GetKey(KeyCode.DownArrow))
        {
            agent.Move(Vector3.forward * speed.z);
        }
        else if (Input.GetKey(KeyCode.RightArrow))          //下
        {
            agent.Move(Vector3.right * speed.z);
        }
        else if (Input.GetKey(KeyCode.C))
        {
        }

        Vector3?dest = null;

        //传送过程中不能操作
        if ((moveState & MoveState.Teleport) == MoveState.NONE)
        {
            if (Input.GetKey(KeyCode.D))      //右
            {
                moveDir = -1;                 //右边
                interTrans.eulerAngles = new Vector3(0, 270, 0);
                int idx = -1;
                if ((idx = CheckTrigger(false, TeleportType.DownRight)) >= 0)                 //传送到其他地方
                {
                    moveState           |= MoveState.Teleport;
                    moveState           &= ~MoveState.Normal;
                    agent.updatePosition = false;
                    lastTrigger          = teleports[idx];

                    teleportStartPos  = transform.position;
                    teleportDest      = lastTrigger.worldDestPos;
                    teleportDest.x   += modelSize.x / 2 * moveDir;
                    totalTeleportTime = Mathf.Sqrt(Mathf.Abs(teleportDest.y - transform.position.y) * 2 / gravity); //总时间
                    curTeleportTime   = 0f;
                    teleportVel       = new Vector3(moveDir * agent.speed, 0f, 0f);                                 // (teleportDest - teleportStartPos + 0.5f * new Vector3(0f, gravity, 0f)  * teleportTime * teleportTime) / teleportTime;
                }
                else
                {
                    moveState |= MoveState.Normal;
                    dest       = agent.transform.position + Vector3.left * speed.z;              //
                }
            }
            else if (Input.GetKey(KeyCode.W))
            {
                moveState |= MoveState.Normal;
                dest       = agent.transform.position + Vector3.back * speed.z;
            }
            else if (Input.GetKey(KeyCode.S))
            {
                moveState |= MoveState.Normal;
                dest       = agent.transform.position + Vector3.forward * speed.z;
            }
            else if (Input.GetKey(KeyCode.A))              //左
            {
                interTrans.eulerAngles = new Vector3(0, 90, 0);
                moveDir = 1;
                int idx = -1;
                if ((idx = CheckTrigger(false, TeleportType.DownLeft)) >= 0)                 //传送到其他地方
                {
                    moveState           |= MoveState.Teleport;
                    moveState           &= ~MoveState.Normal;
                    agent.updatePosition = false;
                    lastTrigger          = teleports[idx];

                    teleportStartPos  = transform.position;
                    teleportDest      = lastTrigger.worldDestPos;
                    teleportDest.x   += modelSize.x / 2 * moveDir;
                    totalTeleportTime = Mathf.Sqrt(Mathf.Abs(teleportDest.y - transform.position.y) * 2 / gravity);                 //总时间
                    curTeleportTime   = 0f;
                    teleportVel       = new Vector3(moveDir * agent.speed, 0f, 0f);
                }
                else
                {
                    moveState |= MoveState.Normal;
                    dest       = agent.transform.position + Vector3.right * speed.z;
                }
            }
            else               //没有一般移动
            {
                moveState &= ~MoveState.Normal;
            }

            //可以同时按下方向键和空格键
            if (Input.GetKey(KeyCode.Space))             //跳跃
            {
                if (jumpTime == 0f)
                {
                    jumpTime = 0f;
                }
                moveState |= MoveState.Jump;

                int idx = -1;
                if ((idx = CheckTrigger(false, moveDir == -1 ? TeleportType.JumpRight : TeleportType.JumpLeft)) >= 0)                 //传送到其他地方
                {
                    moveState           |= MoveState.Teleport;
                    moveState           &= ~MoveState.Normal;
                    agent.updatePosition = false;
                    lastTrigger          = teleports[idx];

                    teleportStartPos = transform.position;
                    teleportDest     = lastTrigger.worldDestPos;
                    float y = 0f;
                    if (lastTrigger.type == TeleportType.UpLeft || lastTrigger.type == TeleportType.UpRight) //向上跳需要更大的加速度
                    {
                        y                 = teleportDest.y - transform.position.y;                           // + 1f;
                        teleportVel       = new Vector3(agent.speed * moveDir, gravity * Mathf.Sqrt(2 * y / gravity), 0f);
                        totalTeleportTime = Mathf.Sqrt(2 * y / gravity);                                     // + Mathf.Sqrt(2/gravity);
                    }
                    else
                    {
                        teleportVel       = new Vector3(agent.speed * moveDir, jumpVel, 0f);
                        y                 = transform.position.y - teleportDest.y;
                        totalTeleportTime = jumpVel / gravity + Mathf.Sqrt(2 * (0.5f * jumpVel * jumpVel / gravity + transform.position.y - teleportDest.y) / gravity);
                    }
                    curTeleportTime = 0f;
                }
            }
        }

        if ((moveState & MoveState.Teleport) != MoveState.NONE)         //传送状态
        {
            if (curTeleportTime < totalTeleportTime)
            {
                curTeleportTime         += Time.deltaTime;
                transform.position       = CalcTeleportPos(curTeleportTime);
                interTrans.localPosition = Vector3.zero;
            }
            else
            {
                var tmp = transform.position;
                tmp.y = teleportDest.y;
                agent.Warp(tmp);
                agent.updatePosition = true;
                moveState           &= ~MoveState.Teleport;
                moveState           &= ~MoveState.Jump;

                totalTeleportTime = 0f;
                curTeleportTime   = -1f;
                lastTrigger       = null;
                animContrller.SetInteger("aniState", (int)PlayerAnimationNames.IDLE1);
            }
        }
        else
        {
            if ((moveState & MoveState.Normal) != MoveState.NONE)             //一般的移动
            {
                if (dest != null)
                {
                    agent.SetDestination(dest.Value);
                }
            }
            else
            {
                agent.Warp(transform.position);                 //停到当前的位置
            }

            if ((moveState & MoveState.Jump) != MoveState.NONE)             //跳跃状态
            {
                var y = jumpVel * jumpTime - 0.5f * gravity * jumpTime * jumpTime;
                jumpTime += Time.deltaTime;
                if (jumpTime > 0.1f && y < 0f)
                {
                    moveState &= ~MoveState.Jump;
                    y          = 0f;
                    jumpTime   = 0f;
                }
                interTrans.localPosition = new Vector3(0, y, 0);
            }
        }

        //动作的处理部分
        if ((moveState & MoveState.Jump) != MoveState.NONE)
        {
            animContrller.SetInteger("aniState", (int)PlayerAnimationNames.JUMP);
        }
        else if ((moveState & MoveState.Normal) != MoveState.NONE)
        {
            animContrller.SetInteger("aniState", (int)PlayerAnimationNames.RUN);
        }
        else
        {
            animContrller.SetInteger("aniState", (int)PlayerAnimationNames.IDLE1);
        }

        if (Input.mouseScrollDelta.y != 0f)
        {
            scrollDelta += Input.mouseScrollDelta.y;
            z           += Input.mouseScrollDelta.y;
            z            = Mathf.Max(z, minZ);
            z            = Mathf.Min(z, maxZ);
        }


        var temp = character.position;

        temp.z = z;

        cam.transform.position = temp;
    }