using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Mime; using System.Runtime.CompilerServices; using Games.GlobeDefine; using Games.LogicObj; using GCGame.Table; using UnityEngine; using System.Collections; public class CameraRockTest : MonoBehaviour { private float m_CameraXOffset = 7.8f; //摄像机相对主角的X偏移 private float m_CameraYOffset = 8.0f; //摄像机相对主角的Y偏移 private float m_CameraZOffset = -9.0f; //摄像机相对主角的Z偏移 private float m_CameraXOffsetMax = 7.8f; //摄像机相对主角的X偏移 private float m_CameraYOffsetMax = 8.0f; //摄像机相对主角的Y偏移 private float m_CameraZOffsetMax = -9.0f; //摄像机相对主角的Z偏移 private float m_CameraXOffsetMin = 4.0f; private float m_CameraYOffsetMin = 4.0f; private float m_CameraZOffsetMin = -5.0f; private float m_Scale = 1.0f; //private float m_pinchSpeed = 100.0f; //private float m_UpOffset = -0.7f; //摄像机Look旋转锁定的Y轴偏移(相对于归一化的向量) private float m_CenterOffest = 0.6f; //private float m_CenterOffsetMax = 0.9f; //private float m_CenterOffsetMin = 0.6f; //private float m_PinchMax = 10.0f; private Vector3 m_PlayerPos = new Vector3(0, 0, 0); /// /// 震屏START /// private bool m_bIsPlayRock = false; //是否震屏 public float m_fNeedRockTime = 0.0f; //震屏持续时间 public float m_fDelayTime= 0.0f; //震屏延迟时间 //private bool m_bContinueRockDie = false; //主角死亡是否继续震屏 private float m_fRockTime = 0.0f; //震屏已经震了多久 public AnimationCurve m_XRockOff =new AnimationCurve(); //震屏 摄像机X位置偏移 public AnimationCurve m_YRockOff = new AnimationCurve(); //震屏 摄像机Y位置偏移 public AnimationCurve m_ZRockOff = new AnimationCurve();//震屏 摄像机Z位置偏移 public AnimationCurve m_RXRockOff = new AnimationCurve();//震屏 摄像机X旋转偏移 public AnimationCurve m_RYRockOff = new AnimationCurve();//震屏 摄像机Y旋转偏移 public AnimationCurve m_RZRockOff = new AnimationCurve();//震屏 摄像机Z旋转偏移 /// /// 震屏 END /// private int m_PosxIndex =-1; public int PosxIndex { get { return m_PosxIndex; } set { m_PosxIndex = value; } } private int m_PosYIndex = -1; public int PosYIndex { get { return m_PosYIndex; } set { m_PosYIndex = value; } } private int m_PosZIndex = -1; public int PosZIndex { get { return m_PosZIndex; } set { m_PosZIndex = value; } } private int m_RXIndex = -1; public int RXIndex { get { return m_RXIndex; } set { m_RXIndex = value; } } private int m_RYIndex = -1; public int RYIndex { get { return m_RYIndex; } set { m_RYIndex = value; } } private int m_RZIndex = -1; public int RZIndex { get { return m_RZIndex; } set { m_RZIndex = value; } } // 缓存 private Transform mTrans; private Transform mMainCameraTrans; void Start() { if (null == GameManager.gameManager) return; this.transform.position = m_PlayerPos; } void Update() { UpdateCameraRock(); } public void Play() { m_fRockTime = 0.0f; m_bIsPlayRock = true; } //更新场景摄像机 public void UpdateCameraRock() { //摄像机抖动 if (m_bIsPlayRock ) { m_fDelayTime -= Time.deltaTime; if (m_fDelayTime <=0) { if (m_fRockTime - m_fNeedRockTime >= 0) { m_bIsPlayRock = false; m_fRockTime = 0.0f; m_fDelayTime = 0.0f; return; } CarmerRock(); return; } } if (null == mTrans) { mTrans = gameObject.transform; if (null == mTrans) { return; } } if (null == mMainCameraTrans) { mMainCameraTrans = Camera.main.transform; if (null == mMainCameraTrans) { return; } } //更新摄像机的角度 m_CameraXOffset = (m_CameraXOffsetMax - m_CameraXOffsetMin) * m_Scale + m_CameraXOffsetMin; m_CameraYOffset = (m_CameraYOffsetMax - m_CameraYOffsetMin) * m_Scale+ m_CameraYOffsetMin; m_CameraZOffset = (m_CameraZOffsetMax - m_CameraZOffsetMin) * m_Scale+ m_CameraZOffsetMin; Vector3 dir = new Vector3(m_CameraXOffset, m_CameraYOffset, m_CameraZOffset); Vector3 cameraPos = mTrans.localPosition + dir; mMainCameraTrans.localPosition = cameraPos; //更新摄像机的Look点,锁定Y轴偏移 Vector3 pos = mTrans.position; pos.y += m_CenterOffest; Vector3 lookPos = pos - mMainCameraTrans.position; lookPos.Normalize(); mMainCameraTrans.rotation = Quaternion.LookRotation(lookPos); } protected void CarmerRock() { m_fRockTime += Time.deltaTime; float nNewXPos = m_CameraXOffset + m_XRockOff.Evaluate(m_fRockTime); float nNewYPos = m_CameraYOffset + m_YRockOff.Evaluate(m_fRockTime); float nNewZPos = m_CameraZOffset + m_ZRockOff.Evaluate(m_fRockTime); //更新摄像机的角度 Vector3 dir = new Vector3(nNewXPos, nNewYPos, nNewZPos); Vector3 cameraPos = this.gameObject.transform.localPosition + dir; Camera.main.transform.localPosition = cameraPos; //更新摄像机的Look点 Vector3 pos = this.gameObject.transform.position; pos.y += m_CenterOffest; Vector3 lookPos = pos - Camera.main.transform.position; lookPos.Normalize(); float nNewRXPos = lookPos.x + m_RXRockOff.Evaluate(m_fRockTime); float nNewRYPos = lookPos.y + m_RYRockOff.Evaluate(m_fRockTime); float nNewRZPos = lookPos.z + m_RZRockOff.Evaluate(m_fRockTime); Camera.main.transform.rotation = Quaternion.LookRotation(new Vector3(nNewRXPos,nNewRYPos,nNewRZPos)); } public void WriteCurveValue() { StreamWriter swRet; FileInfo RetFile = new FileInfo("D:\\AnimationCurveRet.txt"); if (RetFile.Exists) { swRet = new StreamWriter("D:\\AnimationCurveRet.txt", true, System.Text.Encoding.Unicode); } else { swRet = new StreamWriter("D:\\AnimationCurveRet.txt", false, System.Text.Encoding.Unicode); swRet.WriteLine("动画曲线ID\t描述\t曲线节点索引\t时间\t值\t切入正切角度\t切出正切角度\t正切模式\t开始WrapMode(0Default 1Clamp 1Once 2Loop 4PingPong 8ClampForever)\t结束WrapMode(0Default 1Clamp 1Once 2Loop 4PingPong 8ClampForever)"); } int nIndex = Convert.ToInt32(System.DateTime.Now.ToString("ddHHmmss"))*10; if (m_XRockOff.length >0) { int keyCount = 0; nIndex++; m_PosxIndex = nIndex; foreach (Keyframe frame in m_XRockOff.keys) { string strLine = nIndex + "\t" + "PosX震屏持续时间:"+m_fNeedRockTime+ "\t" + keyCount + "\t" + frame.time + "\t" + frame.value + "\t" + frame.inTangent + "\t" + frame.outTangent + "\t" + frame.tangentMode + "\t" + (int)m_XRockOff.preWrapMode + "\t" + (int)m_XRockOff.postWrapMode; swRet.WriteLine(strLine); keyCount++; } } if (m_YRockOff.length > 0) { int keyCount = 0; nIndex++; m_PosYIndex = nIndex; foreach (Keyframe frame in m_YRockOff.keys) { string strLine = nIndex + "\t" + "PosY震屏持续时间:" + m_fNeedRockTime + "\t" + keyCount + "\t" + frame.time + "\t" + frame.value + "\t" + frame.inTangent + "\t" + frame.outTangent + "\t" + frame.tangentMode + "\t" + (int)m_YRockOff.preWrapMode + "\t" + (int)m_YRockOff.postWrapMode; swRet.WriteLine(strLine); keyCount++; } } if (m_ZRockOff.length > 0) { int keyCount = 0; nIndex++; m_PosZIndex = nIndex; foreach (Keyframe frame in m_ZRockOff.keys) { string strLine = nIndex + "\t" + "PosZ震屏持续时间:" + m_fNeedRockTime + "\t" + keyCount + "\t" + frame.time + "\t" + frame.value + "\t" + frame.inTangent + "\t" + frame.outTangent + "\t" + frame.tangentMode + "\t" + (int)m_ZRockOff.preWrapMode + "\t" + (int)m_ZRockOff.postWrapMode; swRet.WriteLine(strLine); keyCount++; } } if (m_RXRockOff.length > 0) { int keyCount = 0; nIndex++; m_RXIndex = nIndex; foreach (Keyframe frame in m_RXRockOff.keys) { string strLine = nIndex + "\t" + "RX震屏持续时间:" + m_fNeedRockTime + "\t" + keyCount + "\t" + frame.time + "\t" + frame.value + "\t" + frame.inTangent + "\t" + frame.outTangent + "\t" + frame.tangentMode + "\t" + (int)m_RXRockOff.preWrapMode + "\t" + (int)m_RXRockOff.postWrapMode; swRet.WriteLine(strLine); keyCount++; } } if (m_RYRockOff.length > 0) { int keyCount = 0; nIndex++; m_RYIndex = nIndex; foreach (Keyframe frame in m_RYRockOff.keys) { string strLine = nIndex + "\t" + "RY震屏持续时间:" + m_fNeedRockTime + "\t" + keyCount + "\t" + frame.time + "\t" + frame.value + "\t" + frame.inTangent + "\t" + frame.outTangent + "\t" + frame.tangentMode + "\t" + (int)m_RYRockOff.preWrapMode + "\t" + (int)m_RYRockOff.postWrapMode; swRet.WriteLine(strLine); keyCount++; } } if (m_RZRockOff.length > 0) { int keyCount = 0; nIndex++; m_RZIndex = nIndex; foreach (Keyframe frame in m_RZRockOff.keys) { string strLine = nIndex + "\t" + "RZ震屏持续时间:" + m_fNeedRockTime + "\t" + keyCount + "\t" + frame.time + "\t" + frame.value + "\t" + frame.inTangent + "\t" + frame.outTangent + "\t" + frame.tangentMode + "\t" + (int)m_RZRockOff.preWrapMode + "\t" + (int)m_RZRockOff.postWrapMode; swRet.WriteLine(strLine); keyCount++; } } swRet.Close(); swRet.Dispose(); } public AnimationCurve InitRockOff(int nCurverId) { AnimationCurve RockCurve = new AnimationCurve(); if (nCurverId == -1) { return RockCurve; } StreamReader srRet; FileInfo RetFile = new FileInfo("D:\\AnimationCurveRet.txt"); if (RetFile.Exists ==false) { return RockCurve; } srRet = new StreamReader("D:\\AnimationCurveRet.txt", System.Text.Encoding.Unicode); List strList =new List(); string strLine = srRet.ReadLine(); if (strLine !=null) { string[] SplitArray = strLine.Split(new char[] {'\t'}); if (SplitArray[0]!=null &&SplitArray[0] == nCurverId.ToString()) { strList.Add(strLine); } } while(strLine !=null && srRet.EndOfStream ==false) { strLine = srRet.ReadLine(); if (strLine != null) { string[] SplitArrayNew = strLine.Split(new char[] { '\t' }); if (SplitArrayNew[0] != null && SplitArrayNew[0] == nCurverId.ToString()) { strList.Add(strLine); } } } int preWrapMode = -1; int postWrapMode = -1; if (strList.Count >0) { Keyframe[] XCurverKeyframes = new Keyframe[strList.Count]; for (int i = 0; i < strList.Count; i++) { string[] SplitInfo = strList[i].Split(new char[] {'\t'}); XCurverKeyframes[i].time =(float) Convert.ToDouble(SplitInfo[3]); XCurverKeyframes[i].value = (float)Convert.ToDouble(SplitInfo[4]); XCurverKeyframes[i].inTangent = (float)Convert.ToDouble(SplitInfo[5]); XCurverKeyframes[i].outTangent = (float)Convert.ToDouble(SplitInfo[6]); XCurverKeyframes[i].tangentMode = Convert.ToInt32(SplitInfo[7]); preWrapMode = Convert.ToInt32(SplitInfo[8]); postWrapMode = Convert.ToInt32(SplitInfo[9]); } RockCurve = new AnimationCurve(XCurverKeyframes); RockCurve.preWrapMode = (WrapMode)preWrapMode; RockCurve.postWrapMode = (WrapMode)postWrapMode; } return RockCurve; } public void SetRockXCurve(AnimationCurve curve) { m_XRockOff = curve; } public void SetRockYCurve(AnimationCurve curve) { m_YRockOff = curve; } public void SetRockZCurve(AnimationCurve curve) { m_ZRockOff = curve; } public void SetRockRXCurve(AnimationCurve curve) { m_RXRockOff = curve; } public void SetRockRYCurve(AnimationCurve curve) { m_RYRockOff = curve; } public void SetRockRZCurve(AnimationCurve curve) { m_RZRockOff = curve; } }