Example #1
0
    // ⚠警告:x和y的取值只能为-1,0,1
    float Move(int x, int y)
    {
        Vector3 pos  = transform.localPosition;
        float   buff = speed * Time.deltaTime * 60f * (Input.GetKey(KeyCode.X) ? 2 : 1);

        pos.x += buff * x;
        pos.y += buff * y;
        if (pos.x < sx)
        {
            pos.x = sx;
        }
        if (pos.x > ex)
        {
            pos.x = ex;
        }
        if (pos.y > sy)
        {
            pos.y = sy;
        }
        if (pos.y < ey)
        {
            pos.y = ey;
        }
        transform.localPosition = pos;
        walking = true;
        if (x != 0)
        {
            dir = x < 0 ? walkDir.Left : walkDir.Right;
        }
        if (y != 0)
        {
            dir = y < 0 ? walkDir.Down : walkDir.Up;
        }
        return(y == 0 ? buff * x : buff *y);
    }
Example #2
0
    private void Start()
    {
        // 载入行走图图像集,并初始化相关设置
        Animation = Resources.LoadAll <Sprite>("Players\\" + Character);
        image     = this.GetComponent <SpriteRenderer>();
        // dir = walkDir.Down;
        UploadWalk();
        // 获取地图边界并处理
        Vector3 size = new Vector3(0.25f, 0.25f, 0f);
        Vector3 pos  = GameObject.Find("startDot").transform.localPosition;

        sx  = pos.x + size.x; sy = pos.y - size.y;
        pos = GameObject.Find("endDot").transform.localPosition;
        ex  = pos.x - size.x; ey = pos.y + size.y * 1.7f;
        // 如果是玩家则绑定至MapCamera
        if (Controller)
        {
            MapCamera.Player         = this;
            MapCamera.PlayerCollider = this.transform.Find("Pathfinding").gameObject;
            Pad         = GameObject.Find("MapCamera").transform.Find("MovePad").Find("ball");
            srcClickPos = MapCamera.mcamera.GetComponent <Camera>().WorldToScreenPoint(
                GameObject.Find("MapCamera").transform.Find("MovePad").Find("tipPad").position
                );
            srcPadPos = Pad.localPosition;
        }
        if (Controller) // only controller can havve a pathfinding movement
        {
            bridgeTaskbuilderOMP = new _OutMousePositionBuilder(dataBridge.defaultRayMapPathFindingScript);
        }
        // 如果是玩家并且传送数据不为空,则按照传送设置初始化
        if (Controller && MapCamera.initTp != -1)
        {
            dir = MapCamera.initDir;
            UploadWalk();
            // 取得传送位置坐标
            this.transform.localPosition = GameObject.Find("tp" + MapCamera.initTp).transform.localPosition;
        }
    }
Example #3
0
    void FixedUpdate()
    {
        // 如果剧本正在进行则退出
        if (MapCamera.SuspensionDrama && walkTasks.Count == 0 && Controller)
        {
            adjustableTrigger.GetComponent <Collider2D>().isTrigger = true;
            return;
        }
        // 是否正在执行行走任务?
        bool    isWalkTask = (walkTasks.Count > 0);
        Vector3 pos        = transform.localPosition;

        // 如果有行走任务
        if (isWalkTask)
        {
            walkTask wt = walkTasks.referencePeek;
            // 如果坐标尚未初始化
            if (!wt.isCalculated)
            {
                wt.Caculate(pos);
            }
            // 决定是否修正行走坐标(完成行走)
            bool isFix = false;
            if (wt.x < pos.x)
            {
                Move(-1, 0);
                if (wt.x >= transform.localPosition.x)
                {
                    isFix = true;
                }
            }
            else if (wt.x > pos.x)
            {
                Move(1, 0);
                if (wt.x <= transform.localPosition.x)
                {
                    isFix = true;
                }
            }
            else if (wt.y < pos.y)
            {
                Move(0, -1);
                if (wt.y >= transform.localPosition.y)
                {
                    isFix = true;
                }
            }
            else if (wt.y > pos.y)
            {
                Move(0, 1);
                if (wt.y <= transform.localPosition.y)
                {
                    isFix = true;
                }
            }
            if (!Controller)
            {
                UploadWalk();
            }
            // 修正坐标
            if (isFix)
            {
                Debug.Log("Walktask: " + (walkTasks.Count - 1) + " remaining...");
                FixPos();
                //transform.localPosition = new Vector3(wt.x,wt.y,pos.z);
                walkTasks.Dequeue();
                if (walkTasks.Count == 0)
                {
                    if (tMode)
                    {
                        Debug.Log("Walktask: tasks for Pathfinding is done.");
                        tMode = false;
                        MoveArrow.SetActive(false);
                    }
                    else
                    {
                        Debug.Log("Walktask: tasks for Drama Script is done.");
                        walkTaskCallback();
                    }
                    walking = false;
                    UploadWalk();
                }
            }
        }
        // 如果不是玩家
        if (!Controller)
        {
            return;
        }

        bool isKeyboard = false;

        // 判定调查
        Vector2 spyRay = new Vector2(pos.x, pos.y);

        if (dir == walkDir.Left)
        {
            spyRay.x -= 0.96f;
        }
        else if (dir == walkDir.Right)
        {
            spyRay.x += 0.96f;
        }
        else if (dir == walkDir.Up)
        {
            spyRay.y += 0.96f;
        }
        else
        {
            spyRay.y -= 0.96f;
        }
        CheckObj checkObj = null;

        foreach (RaycastHit2D crash in Physics2D.RaycastAll(spyRay, new Vector2(0, 0)))
        {
            if (crash.collider.gameObject.TryGetComponent <CheckObj>(out checkObj))
            {
                if (MapCamera.HitCheck != checkObj.gameObject)
                {
                    checkObj.CheckEncounter();
                }
                break;
            }
        }
        if (checkObj == null && MapCamera.HitCheck != null)
        {
            MapCamera.HitCheck.GetComponent <CheckObj>().CheckGoodbye();
        }

        // 如果屏幕被点击
        if (Input.GetMouseButton(0))
        {
            if (freeTouchTick < 0.5f)
            {
                if (freeTouchTick < 0.2f && (!isWalkTask || tMode))
                {
                    Vector3 mpos = MapCamera.mcamera.GetComponent <Camera>().ScreenToWorldPoint(Input.mousePosition);
                    foreach (RaycastHit2D hit in Physics2D.RaycastAll(new Vector2(mpos.x, mpos.y), new Vector2(0, 0)))
                    {
                        if (hit.collider.gameObject.name == "MovePad")
                        {
                            Animator padAni = Pad.transform.parent.GetComponent <Animator>();
                            padAni.SetFloat("speed", 1.0f);
                            padAni.Play("MovePad", 0, 0f);
                            Debug.Log("Freemove OK!:" + this.gameObject.name);
                            freeTouchTick = 1f;
                        }
                    }
                    if (freeTouchTick < 0.2f)
                    {
                        Debug.Log("Freemove Failed!:" + this.gameObject.name);
                        freeTouchTick = 0.3f;
                    }
                }
            }
            else
            {
                // 从屏幕坐标换算到世界坐标
                Vector3 mpos = Input.mousePosition;
                // 测算
                float xp = mpos.x - srcClickPos.x, yp = mpos.y - srcClickPos.y;
                float xpro = Mathf.Abs(xp) / 30, ypro = Mathf.Abs(yp) / 30;
                if (xpro > 1)
                {
                    xpro = 1;
                }
                if (ypro > 1)
                {
                    ypro = 1;
                }
                if (xRemain == 0 && yRemain == 0 && (xpro == 1 || ypro == 1))
                {
                    if (Mathf.Abs(xp) > Mathf.Abs(yp))
                    {
                        xRemain        = 1.02f * (xp > 0 ? 1 : -1); firstFreeMove = true; isKeyboard = true;
                        targetRotation = (xp > 0 ? 270f : 90f);
                    }
                    else
                    {
                        yRemain        = 1.02f * (yp > 0 ? 1 : -1); firstFreeMove = true; isKeyboard = true;
                        targetRotation = (yp > 0 ? 0f : 180f);
                    }
                }
                float ro = Pad.eulerAngles.z + (targetRotation - Pad.eulerAngles.z) / 5;
                Pad.eulerAngles = new Vector3(0, 0, ro);
            }
        }
        if (Input.GetMouseButtonUp(0))
        {
            if (!isWalkTask && freeTouchTick < 0.5f && xRemain == 0 && yRemain == 0)
            {
                Debug.Log("Occured pathfinding:" + this.gameObject.name);
                // 必要:开启tMode,将寻路WalkTask与DramaScript的WalkTask区别开来
                tMode = true;
                walkTasks.Clear();
                // 从屏幕坐标换算到世界坐标
                Vector3 mpos = MapCamera.mcamera.GetComponent <Camera>().ScreenToWorldPoint(Input.mousePosition);
                mpos.z = 0;
                // 检查是否点击的是UI而不是地板
                if (EventSystem.current.IsPointerOverGameObject())
                {
                    return;
                }
                // 格式化坐标
                mpos.x = Mathf.Floor(mpos.x / 0.96f) * 0.96f + 0.48f - 0.06f;
                mpos.y = Mathf.Ceil(mpos.y / 0.96f) * 0.96f - 0.48f;
                // 设置点击反馈
                MoveArrow.transform.localPosition = mpos;
                MoveArrow.SetActive(true);
                // 设置walkTask保险
                lpos      = new Vector2(0, 0);
                lposCount = 3;
                //prepare for Event to TRayMapBuilder



                dataBridge.EnqueueTask(bridgeTaskbuilderOMP.BuildProduct(this, mpos));

                freeTouchTick     = 0;
                Pad.localPosition = srcPadPos;
                goto skipKeyboard;
            }
            Animator padAni = Pad.transform.parent.GetComponent <Animator>();
            padAni.SetFloat("speed", -2.0f);
            padAni.Play("MovePad", 0, 1f);
            freeTouchTick     = 0;
            Pad.localPosition = srcPadPos;
        }

        // 检测键盘输入
        if ((!isWalkTask || tMode) && xRemain == 0 && yRemain == 0)
        {
            if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
            {
                xRemain = -1.02f; firstFreeMove = true; isKeyboard = true;
            }
            else if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
            {
                xRemain = 1.02f; firstFreeMove = true; isKeyboard = true;
            }
            else if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
            {
                yRemain = 1.02f; firstFreeMove = true; isKeyboard = true;
            }
            else if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
            {
                yRemain = -1.02f; firstFreeMove = true; isKeyboard = true;
            }
        }
        // 自由移动
        if (xRemain != 0 || yRemain != 0)
        {
            int xDir = xRemain < 0 ? -1 : 1, yDir = yRemain < 0 ? -1 : 1;
            if (xRemain == 0)
            {
                xDir = 0;
            }
            if (yRemain == 0)
            {
                yDir = 0;
            }
            if (firstFreeMove)
            {
                Collider2D crash = Physics2D.Raycast(new Vector2(pos.x + xDir, pos.y + yDir), new Vector2(0, 0)).collider;
                if (crash != null)
                {
                    if (!crash.isTrigger)
                    {
                        if (xDir != 0)
                        {
                            dir = xDir < 0 ? walkDir.Left : walkDir.Right;
                        }
                        if (yDir != 0)
                        {
                            dir = yDir < 0 ? walkDir.Down : walkDir.Up;
                        }
                        walking = true;
                        xRemain = 0; yRemain = 0;
                    }
                }
                firstFreeMove = false;
            }
            if (xRemain != 0)
            {
                xRemain -= Move(xDir, 0);
                if ((xRemain < 0 ? -1 : 1) != xDir)
                {
                    FixPos();
                    walking = true;
                    if (freeTouchTick == 0)
                    {
                        MoveArrow.SetActive(false);
                    }
                    xRemain = 0;
                }
            }
            if (yRemain != 0)
            {
                yRemain -= Move(0, yDir);
                if ((yRemain < 0 ? -1 : 1) != yDir)
                {
                    FixPos();
                    walking = true;
                    if (freeTouchTick == 0)
                    {
                        MoveArrow.SetActive(false);
                    }
                    yRemain = 0;
                }
            }
        }

skipKeyboard:

        if (Controller && adjustableTrigger != null)
        {
            adjustableTrigger.GetComponent <Collider2D>().isTrigger = !isKeyboard;
        }

        // 仅打断寻路task(tMode),不打断DramaScript的task
        if (lpos.x == pos.x && lpos.y == pos.y && isWalkTask && tMode)
        {
            lposCount--;
        }
        if (lposCount == 0 && isWalkTask && tMode)
        {
            Debug.Log("Walktask: tasks for Pathfinding is broke.");
            walking = false;
            UploadWalk();
            walkTasks.Clear(); tMode = false; MoveArrow.SetActive(false);
        }
        lpos = pos;

        // 更新图片
        UploadWalk();
    }