//出現在任何一台攝影影機的瞬間,包含編輯畫面 void OnBecameVisible() { if (!OnCamera.InCamera(LookCamera, gameObject, VisionDistance)) { return; } this.LookState = LookStateEnum.StartLook; OnChangeToStartLook(); }
void CheckOnLook() { Renderer renderer = gameObject.GetComponent <Renderer>(); if (renderer == null) { return; } if (!renderer.isVisible)//出現在任何一台攝影影機中,包含編輯畫面有出現也會判定為true { return; } //DebugSystem.AddLog(DebugSystem.DebugInfo.GetNewDebugInfo( //DebugSystem.DebugInfo.DebugLogTypeEnum.Info, //SystemName, //this.gameObject.name + "被觀看")); if (OnCamera.InCamera(LookCamera, gameObject, VisionDistance)) { if (this.LookState == LookStateEnum.Invisible) { this.LookState = LookStateEnum.StartLook; OnChangeToStartLook(); } } else { if (this.LookState == LookStateEnum.OnLook) { this.LookState = LookStateEnum.ExitLook; OnChangeToExitLook(); } } }
//離開在任何一台攝影影機的瞬間,包含編輯畫面 void OnBecameInvisible() { this.LookState = LookStateEnum.ExitLook; OnChangeToExitLook(); }
void Update() { #region 切換狀態 ////先轉換前一次的瞬間狀態唯持續狀態 if (LookState == LookStateEnum.ExitForceLook) { LookState = LookStateEnum.OnLook; OnChangeToOnLook(); } else if (LookState == LookStateEnum.ExitLook) { LookState = LookStateEnum.Invisible; OnChangeToInvisible(); } else if (LookState == LookStateEnum.StartLook) { LookState = LookStateEnum.OnLook; OnChangeToOnLook(); } #endregion 切換狀態 CheckOnLook(); CheckGazedAt(); UpdatOnForceLookBehavior(); #region 正被注視的狀態 if (LookState == LookStateEnum.OnForceLook) { switch (InteractiveMode) { case InteractiveModeEnum.ControlMe: //移動Cardboard到自己的位置 if (CanControl && Portal.Instance != null && (AutoChangeControler || (Input.GetKey(KeyCode.Joystick1Button7) && Input.GetKeyDown(KeyCode.Joystick1Button0)))) { Portal.Instance.DoPortal(CardBoard, this.gameObject.transform.position); if (StereoController3D != null) { StereoController3D.matchByZoom = 0; } LookState = LookStateEnum.Invisible; OnChangeToInvisible(); HaveGameobjectOnForceLook = null; } break; case InteractiveModeEnum.ControlOther: //Cardboard移動到指定的位置 if (PortalTo != Vector3.zero) { if (CanControl && Portal.Instance != null && (AutoChangeControler || (Input.GetKey(KeyCode.Joystick1Button7) && Input.GetKeyDown(KeyCode.Joystick1Button0)))) { Portal.Instance.DoPortal(CardBoard, PortalTo); if (StereoController3D != null) { StereoController3D.matchByZoom = 0; } LookState = LookStateEnum.Invisible; OnChangeToInvisible(); HaveGameobjectOnForceLook = null; } } break; case InteractiveModeEnum.ProtagonistGoNextPoint: // 主角移動到下一個指定位置 if (PlayerControl.Instance != null) { PlayerControl.Instance.GoNextPoint(); } break; case InteractiveModeEnum.None: default: break; } } #endregion 正被注視的狀態 }
void CheckGazedAt() { if (LookState == LookStateEnum.Invisible) { return; } if (LookState == LookStateEnum.ExitLook) { LookState = LookStateEnum.Invisible; OnChangeToExitLook(); return; } #region 取得看到的物體 if (LookCamera == null) { return; } Ray ray = LookCamera.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0)); RaycastHit hit; if (!Physics.Raycast(ray, out hit, VisionDistance)) { if (OnForceLook) { this.OnForceLook = false; this.ForceLookCheckDone = false; if (HaveGameobjectOnForceLook == gameObject) { HaveGameobjectOnForceLook = null; } this.LookState = LookStateEnum.ExitForceLook; OnChangeToExitForceLook(); } return; } #endregion 取得看到的物體 //檢查看到的物件是否是自己 bool lookMe = hit.transform == transform; if (lookMe && OnForceLook) { LookState = LookStateEnum.OnForceLook; OnChangeToOnForceLook(); return; } if (lookMe && !OnForceLook) { this.OnForceLook = true; this.CheckDoneTime = Time.time + this.WatingTime; this.ForceLookCheckDone = false; HaveGameobjectOnForceLook = gameObject; this.LookState = LookStateEnum.StartForceLook; OnChangeToStartForceLook(); } else if (!lookMe && OnForceLook) { this.LookState = LookStateEnum.ExitForceLook; this.OnForceLook = false; if (HaveGameobjectOnForceLook == gameObject) { HaveGameobjectOnForceLook = null; } OnChangeToExitForceLook(); HaveGameobjectOnForceLook = null; } else { if (this.OnForceLook) { this.OnForceLook = false; } if (this.ForceLookCheckDone) { this.ForceLookCheckDone = false; } if (this.LookState == LookStateEnum.OnForceLook) { this.LookState = LookStateEnum.ExitForceLook; } if (HaveGameobjectOnForceLook == gameObject) { HaveGameobjectOnForceLook = null; } } }
//出現在任何一台攝影影機的瞬間,包含編輯畫面 void OnBecameVisible() { if (!OnCamera.InCamera(LookCamera, gameObject, VisionDistance)) return; this.LookState = LookStateEnum.StartLook; OnChangeToStartLook(); }
void CheckOnLook() { Renderer renderer = gameObject.GetComponent<Renderer>(); if (renderer == null) return; if (!renderer.isVisible)//出現在任何一台攝影影機中,包含編輯畫面有出現也會判定為true return; //DebugSystem.AddLog(DebugSystem.DebugInfo.GetNewDebugInfo( //DebugSystem.DebugInfo.DebugLogTypeEnum.Info, //SystemName, //this.gameObject.name + "被觀看")); if (OnCamera.InCamera(LookCamera, gameObject, VisionDistance)) { if (this.LookState == LookStateEnum.Invisible) { this.LookState = LookStateEnum.StartLook; OnChangeToStartLook(); } } else { if (this.LookState == LookStateEnum.OnLook) { this.LookState = LookStateEnum.ExitLook; OnChangeToExitLook(); } } }
void CheckGazedAt() { if (LookState == LookStateEnum.Invisible) return; if (LookState == LookStateEnum.ExitLook) { LookState = LookStateEnum.Invisible; OnChangeToExitLook(); return; } #region 取得看到的物體 if (LookCamera == null) return; Ray ray = LookCamera.ScreenPointToRay(new Vector3(Screen.width/2, Screen.height/2, 0)); RaycastHit hit; if (!Physics.Raycast(ray, out hit, VisionDistance)) { if (OnForceLook) { this.OnForceLook = false; this.ForceLookCheckDone = false; if (HaveGameobjectOnForceLook == gameObject) HaveGameobjectOnForceLook = null; this.LookState = LookStateEnum.ExitForceLook; OnChangeToExitForceLook(); } return; } #endregion 取得看到的物體 //檢查看到的物件是否是自己 bool lookMe = hit.transform == transform; if (lookMe && OnForceLook) { LookState = LookStateEnum.OnForceLook; OnChangeToOnForceLook(); return; } if (lookMe && !OnForceLook) { this.OnForceLook = true; this.CheckDoneTime = Time.time + this.WatingTime; this.ForceLookCheckDone = false; HaveGameobjectOnForceLook = gameObject; this.LookState = LookStateEnum.StartForceLook; OnChangeToStartForceLook(); } else if(!lookMe && OnForceLook) { this.LookState = LookStateEnum.ExitForceLook; this.OnForceLook = false; if (HaveGameobjectOnForceLook == gameObject) HaveGameobjectOnForceLook = null; OnChangeToExitForceLook(); HaveGameobjectOnForceLook = null; } else { if(this.OnForceLook) this.OnForceLook = false; if(this.ForceLookCheckDone) this.ForceLookCheckDone = false; if(this.LookState == LookStateEnum.OnForceLook) this.LookState = LookStateEnum.ExitForceLook; if(HaveGameobjectOnForceLook==gameObject) HaveGameobjectOnForceLook = null; } }
void Update() { #region 切換狀態 ////先轉換前一次的瞬間狀態唯持續狀態 if (LookState == LookStateEnum.ExitForceLook) { LookState = LookStateEnum.OnLook; OnChangeToOnLook(); } else if (LookState == LookStateEnum.ExitLook) { LookState = LookStateEnum.Invisible; OnChangeToInvisible(); } else if (LookState == LookStateEnum.StartLook) { LookState = LookStateEnum.OnLook; OnChangeToOnLook(); } #endregion 切換狀態 CheckOnLook(); CheckGazedAt(); UpdatOnForceLookBehavior(); #region 正被注視的狀態 if (LookState == LookStateEnum.OnForceLook) { switch (InteractiveMode) { case InteractiveModeEnum.ControlMe: //移動Cardboard到自己的位置 if (CanControl && Portal.Instance != null && (AutoChangeControler || (Input.GetKey(KeyCode.Joystick1Button7) && Input.GetKeyDown(KeyCode.Joystick1Button0)))) { Portal.Instance.DoPortal(CardBoard, this.gameObject.transform.position); if (StereoController3D != null) StereoController3D.matchByZoom = 0; LookState = LookStateEnum.Invisible; OnChangeToInvisible(); HaveGameobjectOnForceLook = null; } break; case InteractiveModeEnum.ControlOther: //Cardboard移動到指定的位置 if (PortalTo != Vector3.zero) { if (CanControl && Portal.Instance != null && (AutoChangeControler || (Input.GetKey(KeyCode.Joystick1Button7) && Input.GetKeyDown(KeyCode.Joystick1Button0)))) { Portal.Instance.DoPortal(CardBoard, PortalTo); if (StereoController3D != null) StereoController3D.matchByZoom = 0; LookState = LookStateEnum.Invisible; OnChangeToInvisible(); HaveGameobjectOnForceLook = null; } } break; case InteractiveModeEnum.ProtagonistGoNextPoint: // 主角移動到下一個指定位置 if (PlayerControl.Instance != null) PlayerControl.Instance.GoNextPoint(); break; case InteractiveModeEnum.None: default: break; } } #endregion 正被注視的狀態 }