using DG.Tweening; using ET.EventType; using FairyGUI; using UnityEngine; using UnityEngine.Playables; namespace ET.Client { public static class CameraMgr { public static Camera MainCamera { get; private set; } public static void Init() { MainCamera = Camera.main; MainCamera.transform.SetPositionAndRotation(new Vector3(230, 35, -5), Quaternion.Euler(20, 0, 0)); MainCamera.fieldOfView = 60; } [Event] public class SceneChangeFinishEvent : BEvent { protected override async ETTask OnEvent(SceneLoadFinish a) { GRoot.inst.RemoveChildren(); var playable = MainCamera.GetComponent(); if (playable != null) { playable.Play(); playable.stopped += (pd) => { EventSystem.Instance.Publish(); GameObject.Destroy(playable); var ani = MainCamera.GetComponent(); if(ani != null) GameObject.Destroy(ani); }; } else { Log.Error("Not Found Camera PlayableDirector"); EventSystem.Instance.Publish(); } await ETTask.CompletedTask; } } //相机跟随主角 public static void FollowMe(Vector3 pos) { /*var camera = Camera.main; pos.x += 7; pos.y = 15; pos.z -= 25; camera.transform.position = pos;*/ } private static bool bShaking = false; public static void ShakeMe(float shakeTime, Vector3 shakeStength) { if (bShaking) return; bShaking = true; Transform trans = MainCamera.transform; var savePos = trans.localPosition; Tweener tweener = trans.DOShakePosition(shakeTime, shakeStength); tweener.OnComplete(() => { trans.localPosition = savePos; bShaking = false; }); } public static Vector3 CarmeraPos() { return Camera.main.transform.position; } public static void DragMe(Vector3 start, Vector3 end, float duration, System.Action endcb) { Transform trans = MainCamera.transform; trans.position = start; var tweener = trans.DOMove(end, duration); tweener.OnComplete(() => { endcb ?.Invoke(); }); } } [Event] public class CameraEventHandler : BEvent { protected override async ETTask OnEvent(CameraEvent args) { var endpos = new Vector3(args.X, args.Y, args.Z); float time = (float)args.TimeMS / 1000; Transform trans = CameraMgr.MainCamera.transform; if (args.MoveSpeedSec > 0.0001 && time < 0.01) { var dis = Vector3.Distance(trans.position, endpos); time = dis / args.MoveSpeedSec; } trans.DOMove(endpos, time); await ETTask.CompletedTask; } } }