// ⚠警告: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); }
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; } }
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(); }