移动控制

MovCtrl.cs

using UnityEngine;
using System.Text;
using System.IO;
using System;
using System.Runtime.InteropServices;
using System.Collections;
using System.Collections.Specialized;
using System.Linq;
using System.Collections.Generic;

public class MovCtrl : MonoBehaviour 
{
    public Transform trans;
    public Vector3 mov;
    public Vector3 OrgPos;
    public Vector3 orgPos
    {
        get
        {
            return OrgPos;
        }
        set
        {
            OrgPos = value;
        }
    }
    public Vector3 rtAix;
    public float angle;
    public  Quaternion orgRt;
    [Tooltip("记录帧数,1秒大概50帧")]
    public int ZhenNumber=50;
    public int ZhenSum;
    public float time;
    public float timeLen; 
    public float startTime;
    public enum FuncList{eFix, eUnfix};
    public enum movState{eFixing = -1, eUnmov, eUnfixing};
    public enum FixState{eUnfixed, eFixed};
    public bool needToFixedBeforeShowParent;
    public FixState fstate= FixState.eUnfixed;
    public FixState fst
    {
        get { return fstate; }
        set {
            fstate = value;
            //if (value == FixState.eFixed)
            //{
            //    FuncReactor myFr = transform.GetComponent();
            //    if (myFr != null)
            //    {
            //        myFr.ContributeKeys();
            //        myFr.Hstate = FuncReactor.hangState.ePrtFixed;
            //    }
            //}
        }
    }
    public movState mst = movState.eUnmov;
    public bool showWhenUnfix = false;
    //public FuncList curFunc;
    protected bool isActive = false;
    [DllImport( "kernel32" )]
    private static extern long WritePrivateProfileString (string section ,
                                                          string key , 
                                                          string val, 
                                                          string filePath );
    [DllImport("kernel32")]
    private static extern int GetPrivateProfileString (string section,
                                                       string key,
                                                       string def,
                                                       StringBuilder retVal,
                                                       int size,
                                                       string filePath);
    
    public static string movDataFile = "D:\\TieTa2\\ExternData\\mov.dat";
    void Start () 
    {
        

        trans = transform;
        {
            orgPos = trans.localPosition;
            orgRt = trans.localRotation;
        }
        timeLen = time;
        ZhenSum=ZhenNumber;
        startTime = 0;
        //hideAll(true);
        if(fst == FixState.eUnfixed)
        {
            quickUnfix();
        }
        else
        {
            quickFix();
        }
        fst=FixState.eFixed;
        mst=movState.eFixing;
    }
    //按帧数累加(1秒50帧)
    public void FixedUpdate()
    {
        if(mst == movState.eUnmov)    
        {
            return;
        }
        if(ZhenNumber > 0)
        {
            trans.localPosition += (int)mst * mov * 1 / ZhenSum;
            Transform rtAixTran = trans.FindChild("RtAix");
            if(rtAixTran != null)
            {
                
            }
            else
            {
                trans.Rotate(rtAix, (int)mst * angle * 1 / ZhenSum, Space.Self);
            }
            ZhenNumber--;
            //ZhenSum++;
        }
        else
        {
            ZhenNumber = 0;
            if(mst == movState.eUnfixing)
            {
                fst = FixState.eUnfixed;
            }
            else
            {
                fst = FixState.eFixed;
            }
            mst = movState.eUnmov;
            isActive = false;
        }
    }
    public virtual void LoadInit()
    {
        if(fst == FixState.eUnfixed)
        {
            quickUnfix();
        }
        else
        {
            quickFix();
        }
    }
    
    public bool isFixed()
    {
        if(fst == FixState.eFixed)
        {
            return true;
        }
        return false;
    }
    
    public virtual void quickFix()
    {
        //Debug.Log(trans.name + "qf");
        if (trans != null)
        {
            trans.localPosition = orgPos;
            trans.localRotation = orgRt;
        }
        mst = movState.eUnmov;
       // fstate= FixState.eFixed;
        fst = FixState.eFixed;
        
        //StartCoroutine(fr.coroutineComplete(1.0f));
    }
    public void quickUnfix()
    {
        trans.localPosition = orgPos;
        trans.localRotation = orgRt;
        trans.localPosition += mov;
        
        Transform rtAixTran = trans.FindChild("RtAix");
        if(rtAixTran != null)
        {
            Vector3 rtAix2 = Vector3.zero;
            if(rtAix.x == 1)
            {
                rtAix2 = rtAixTran.right;
            }
            else if(rtAix.y == 1)
            {
                rtAix2 = rtAixTran.up;
            }
            else if(rtAix.z == 1)
            {
                rtAix2 = rtAixTran.forward;
            }
            trans.RotateAround(rtAixTran.position, rtAix2, angle);
        }
        else
        {
            trans.Rotate(rtAix, angle, Space.Self);
        }
        mst = movState.eUnmov;
        fst = FixState.eUnfixed;
    }
    public virtual void overrideFix()
    {
        isActive = true;
        trans.localPosition = orgPos;
        trans.localRotation = orgRt;
        trans.localPosition += mov;
        //trans.Rotate(rtAix, angle, Space.Self);
        Transform rtAixTran = trans.FindChild("RtAix");
        if(rtAixTran != null)
        {
            Vector3 rtAix2 = Vector3.zero;
            if(rtAix.x == 1)
            {
                rtAix2 = rtAixTran.right;
            }
            else if(rtAix.y == 1)
            {
                rtAix2 = rtAixTran.up;
            }
            else if(rtAix.z == 1)
            {
                rtAix2 = rtAixTran.forward;
            }
            trans.RotateAround(rtAixTran.position, rtAix2, angle);
            Debug.Log(rtAix2);
        }
        else
        {
            trans.Rotate(rtAix, angle, Space.Self);
        }
        time = timeLen;
        mst = movState.eFixing;
    }
    public virtual IEnumerator fix()
    {
        yield return new WaitForSeconds(startTime);
        //Debug.Log(gameObject.name + " fix time " + Time.time);
        overrideFix();
    }
    public virtual void overrideUnfix()
    {
        isActive = true;
        trans.localPosition = orgPos;
        trans.localRotation = orgRt;
        time = timeLen;
        Debug.Log("HERE"+gameObject.name);
        mst = movState.eUnfixing;
    }
    public IEnumerator unfix()
    {
        yield return new WaitForSeconds(startTime);
        Debug.Log("unfix");
        //Debug.Log(gameObject.name + " fix time " + Time.time);
        overrideUnfix();
    }
    
//  public void hide(bool ishide)
//  {
//      MeshRenderer rd = trans.GetComponent();
//      if(rd != null)
//      {   
//          rd.enabled = !ishide;
//          Collider cld = transform.GetComponent();
//          if(cld != null)
//          {
//              cld.isTrigger = ishide;
//          }
//      }
//  }
    //  public void hideAll(bool ishide)
//  {
//      foreach (Transform t in trans.GetComponentsInChildren()) 
//      {
//          MeshRenderer rd = t.GetComponent();
//          if(rd != null)
//          {
//              //Debug.Log("hd+ " + t.name + ishide);
//              rd.enabled = !ishide;
//              Collider cld = t.GetComponent();
//              if(cld != null)
//              {
//                  cld.isTrigger = ishide;
//              }
//          }
//      }
//  }
    // Update is called once per frame



    //按时间累加计算时间
    public void Update () 
    {
//      if(mst == movState.eUnmov)    
//      {
//          return;
//      }
//      if(time > Time.deltaTime)
//      {
//          trans.localPosition += (int)mst * mov * Time.deltaTime / timeLen;
//          Transform rtAixTran = trans.FindChild("RtAix");
//          if(rtAixTran != null)
//          {
//              Vector3 rtAix2 = Vector3.zero;
//              if(rtAix.x == 1)
//              {
//                  rtAix2 = rtAixTran.right;
//              }
//              else if(rtAix.y == 1)
//              {
//                  rtAix2 = rtAixTran.up;
//              }
//              else if(rtAix.z == 1)
//              {
//                  rtAix2 = rtAixTran.forward;
//              }
//              trans.RotateAround(rtAixTran.position, rtAix2, (int)mst * angle * Time.deltaTime / timeLen);
//              //Debug.Log(rtAix2);
//          }
//          else
//          {
//              trans.Rotate(rtAix, (int)mst * angle * Time.deltaTime / timeLen, Space.Self);
//          }
//          time -= Time.deltaTime;
//      }
//      else
//      {
//          time = 0.0f;
//          if(mst == movState.eUnfixing)
//          {
//              fst = FixState.eUnfixed;
//          }
//          else
//          {
//              //trans.localPosition = orgPos;
//              //trans.localRotation = orgRt;
//              fst = FixState.eFixed;
//          }
//          mst = movState.eUnmov;
//          isActive = false;
//      }
    }
    void save()
    {
        string name = trans.name;
        WritePrivateProfileString(name, "movX", mov.x.ToString(), movDataFile);
        WritePrivateProfileString(name, "movY", mov.y.ToString(), movDataFile);
        WritePrivateProfileString(name, "movZ", mov.z.ToString(), movDataFile);
        WritePrivateProfileString(name, "rtAixX", rtAix.x.ToString(), movDataFile);
        WritePrivateProfileString(name, "rtAixY", rtAix.y.ToString(), movDataFile);
        WritePrivateProfileString(name, "rtAixZ", rtAix.z.ToString(), movDataFile);
        WritePrivateProfileString(name, "angle", angle.ToString(), movDataFile);
        WritePrivateProfileString(name, "time", time.ToString(), movDataFile);
    }
    void load(string name)
    {
        {
            StringBuilder info = new StringBuilder();
            GetPrivateProfileString(name, "movX", "0.0", info, 100, movDataFile);
            mov.x = (float)Convert.ToDouble(info.ToString());
        }
        {
            StringBuilder info = new StringBuilder();
            GetPrivateProfileString(name, "movY", "0.0", info, 100, movDataFile);
            mov.y = (float)Convert.ToDouble(info.ToString());
        }
        {
            StringBuilder info = new StringBuilder();
            GetPrivateProfileString(name, "movZ", "0.0", info, 100, movDataFile);
            mov.z = (float)Convert.ToDouble(info.ToString());
        }
        {
            StringBuilder info = new StringBuilder();
            GetPrivateProfileString(name, "rtAixX", "0.0", info, 100, movDataFile);
            rtAix.x = (float)Convert.ToDouble(info.ToString());
        }
        {
            StringBuilder info = new StringBuilder();
            GetPrivateProfileString(name, "rtAixY", "0.0", info, 100, movDataFile);
            rtAix.y = (float)Convert.ToDouble(info.ToString());
        }
        {
            StringBuilder info = new StringBuilder();
            GetPrivateProfileString(name, "rtAixZ", "0.0", info, 100, movDataFile);
            rtAix.z = (float)Convert.ToDouble(info.ToString());
        }
        {
            StringBuilder info = new StringBuilder();
            GetPrivateProfileString(name, "angle", "0.0", info, 100, movDataFile);
            angle = (float)Convert.ToDouble(info.ToString());
        }
        {
            StringBuilder info = new StringBuilder();
            GetPrivateProfileString(name, "time", "0.0", info, 100, movDataFile);
            time = (float)Convert.ToDouble(info.ToString());
        }
    }
    
    void OnGUI()
    {   
//      if(GUI.Button(new Rect(10,10,100,20),"Save"))
//      {
//          save();
//      }
//      if(GUI.Button(new Rect(10,40,100,20),"Load"))
//      {
//          load(trans.name);
//      }
//      if(GUI.Button(new Rect(10,60,100,20),"Fix"))
//      {
//          fix();
//      }
//      if(GUI.Button(new Rect(10,90,100,20),"Unfix"))
//      {
//          unfix();
//      }
//      if(GUI.Button(new Rect(10,120,100,20),"hid"))
//      {
//          hideAll(true);
//      }
//      if(GUI.Button(new Rect(10,150,100,20),"show"))
//      {
//          hideAll(false);
//      }
    }
    
//  public virtual void saveDoc(string docPath)
//  {
//      Std.WritePrivateProfileString(transform.GetHashCode().ToString(), "FixState", fst.ToString(), docPath);
//  }
//  
//  public virtual void loadDoc(string docPath)
//  {
//      //Debug.Log(docPath);
//      StringBuilder strBd = new StringBuilder();
//      if(Std.GetPrivateProfileString(transform.GetHashCode().ToString(), "FixState", "-100", strBd, 100, docPath) == 0)
//      {
//          throw(new ApplicationException("Ini Reading Er"));
//      }
//      //Debug.Log(transform.name + " is " + strBd);
//      if(strBd.ToString().CompareTo("eFixed") == 0)
//      {
//          fst = FixState.eFixed;
//          //quickFix();
//      }
//      else
//      {
//          fst = FixState.eUnfixed;
//          //quickUnfix();
//      }
//  }
    

}

你可能感兴趣的:(移动控制)