狀態(tài)記錄器(ITween)

PosStateRecord.cs

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

[AddComponentMenu("狀態(tài)記錄器")]
public class PosStateRecord : MonoBehaviour 
{
    public string rcdName;
    [System.Serializable]
    public class PosState
    {
        public string name;
        public Vector3 lpos;
        public Vector3 lcSc;
        public Quaternion rt;
        public Transform parent;
        public PosState(string _name, Vector3 _lpos, Vector3 _lcSc, Quaternion _rt, Transform _prt)
        {
            name = _name;
            lpos = _lpos;
            lcSc = _lcSc;
            rt = _rt;
            parent = _prt;
        }
        //用于重命名
        public PosState(string _name, PosState _ps)
        {
            parent = _ps.parent;
            name = _name;
            lpos = _ps.lpos;
            lcSc = _ps.lcSc;
            rt = _ps.rt;
        }
    }

    //void Start()
    //{
    //    rcdName = gameObject.name + "_s" + "PosStateRecord";
    //}

    public List<PosState> pss = new List<PosState>();

    public Vector3 getLocalPosition(string _name)
    {
        foreach (PosState ps in pss)
        {
            if (ps.name.CompareTo(_name) == 0)
            {
                return ps.lpos;
            }
        }
        Debug.LogError("沒(méi)找到該位置");
        return Vector3.zero;
    }

    public bool setLocation(string _name)
    {
        for (int i = 0; i < pss.Count; ++i )
        {
            if (pss[i].name.CompareTo(_name) == 0)
            {
                pss[i] = new PosStateRecord.PosState(pss[i].name,
                                                 transform.localPosition,
                                                 transform.localScale,
                                                 transform.localRotation,
                                                 transform.parent);
                return true;
            }
        }
        return false;
    }

    public void setPosition(string _name, Vector3 _pos)
    {
        foreach (PosState ps in pss)
        {
            if (ps.name.CompareTo(_name) == 0)
            {
                Transform p = getParent(_name);
                if (p == null)
                {
                    ps.lpos = _pos;
                }
                else
                {
                    ps.lpos = p.InverseTransformPoint(_pos);
                }
            }
        }
    }

    public Vector3 getPosition(string _name)
    {
        foreach (PosState ps in pss)
        {
            if (ps.name.CompareTo(_name) == 0)
            {
                Transform p = getParent(_name);
                if (p == null)
                {
                    return getLocalPosition(_name);
                }
                else
                {
                    return p.TransformPoint(ps.lpos);
                }
            }
        }
        Debug.LogError("沒(méi)找到該位置");
        return Vector3.zero;
    }

    public Vector3 getLocalScale(string _name)
    {
        foreach (PosState ps in pss)
        {
            if (ps.name.CompareTo(_name) == 0)
            {
                return ps.lcSc;
            }
        }
        Debug.LogError("沒(méi)找到該縮放");
        return Vector3.one;
    }

    public Quaternion getLocalRotation(string _name)
    {
        foreach (PosState ps in pss)
        {
            if (ps.name.CompareTo(_name) == 0)
            {
                return ps.rt;
            }
        }
        Debug.LogError("沒(méi)找到該旋轉(zhuǎn)");
        return Quaternion.identity;
    }

    public Quaternion getRotation(string _name)
    {
        foreach (PosState ps in pss)
        {
            if (ps.name.CompareTo(_name) == 0)
            {
                Transform p = getParent(_name);
                if (p == null)
                {
                    return getLocalRotation(_name);
                }
                else
                {
                    Transform tp = new GameObject().transform;
                    tp.name = "forRcdChange";
                    tp.parent = p;
                    tp.localRotation = ps.rt;
                    Quaternion res = tp.rotation;
                    DestroyImmediate(tp.gameObject);
                    return res;
                }
            }
        }
        Debug.LogError("沒(méi)找到該旋轉(zhuǎn)");
        return Quaternion.identity;
    }

    public Transform getParent(string _name)
    {
        foreach (PosState ps in pss)
        {
            if (ps.name.CompareTo(_name) == 0)
            {
                return ps.parent;
            }
        }
        Debug.LogError("沒(méi)找到該父物體");
        return null;
    }

    public Transform getLocation(string name)
    {
        Transform res = new GameObject().transform;
        res.name = rcdName + "_s_" + name;
        location(res, name);
        return res;
    }

    public Transform getLocation(PosState _ps)
    {
        Transform res = new GameObject().transform;
        location(res, _ps);
        return res;
    }

    public bool location(string name)
    {
        return location(transform, name);
    }

    public void smLocation(string name, float tm)
    {
        StartCoroutine(curshionSmLocation(name, tm));
    }

    IEnumerator curshionSmLocation(string name, float tm)
    {
        Transform targetPt = new GameObject().transform;
        targetPt.position = getPosition(name);
        targetPt.rotation = getRotation(name);
        targetPt.localScale = getLocalScale(name);
        iTween.MoveTo(gameObject,
                      iTween.Hash("x", targetPt.position.x,
                      "y", targetPt.position.y,
                      "z", targetPt.position.z,
                      "time", tm,
                      "easetype", iTween.EaseType.linear));
        iTween.RotateTo(gameObject, iTween.Hash("x", targetPt.eulerAngles.x,
                                                "y", targetPt.eulerAngles.y,
                                                "z", targetPt.eulerAngles.z,
                                               "time", tm,
                                               "easetype", iTween.EaseType.linear));
        iTween.ScaleTo(gameObject, iTween.Hash("x", targetPt.localScale.x,
                                              "y", targetPt.localScale.y,
                                              "z", targetPt.localScale.z,
                                             "time", tm,
                                             "easetype", iTween.EaseType.linear));
        yield return new WaitForSeconds(tm + 1.0f);
        DestroyImmediate(targetPt.gameObject);
        location(name);
    }

    public bool location(Transform t,string name)
    {
        foreach (PosState ps in pss)
        {
            if (ps.name.CompareTo(name) == 0)
            {
                return location(t, ps);
            }
        }
        return false;
    }

    public bool location(PosState _ps)
    {
        location(transform, _ps);
        return true;
    }

    public bool location(Transform t ,PosState _ps)
    {
        t.parent = _ps.parent;
        t.localPosition = _ps.lpos;
        t.localRotation = _ps.rt;
        t.localScale = _ps.lcSc;
        return true;
    }
}

PosStateRecordEditor.cs

using UnityEngine;
using UnityEditor;
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;

[CustomEditor(typeof(PosStateRecord))] //對(duì)UIWidget對(duì)象編輯窗進(jìn)行的重構(gòu)
public class PosStateRecordEditor : Editor
{
    static bool isShowDef = false;
    
    public string stName;
    public override void OnInspectorGUI()
    {
        PosStateRecord psr = (PosStateRecord)target;
        GUILayout.BeginVertical();
        GUILayout.BeginHorizontal();
        GUILayout.Label("Wei");
        psr.rcdName = EditorGUILayout.TextField(psr.rcdName);
        GUILayout.Label("Create");
        if (GUILayout.Button("Mingwei"))
        {
            psr.rcdName = psr.transform.name;
        }
        stName = EditorGUILayout.TextField(stName);
        //GUILayout.Label("的狀態(tài)");
        if (GUILayout.Button("Save"))
        {
            if (!nameCheck(stName))
            {
                EditorUtility.DisplayDialog("錯(cuò)誤",
                                            "記錄器不允許空名趴腋,重名等現(xiàn)象宏所。因?yàn)檫@些名字最后是用來(lái)做檢索的,取個(gè)有意義點(diǎn)的名字吧怠益!以后好找!",
                                            "這就改名");
                return;
            }
            psr.pss.Add(new PosStateRecord.PosState(stName, 
                                                    psr.transform.localPosition,
                                                    psr.transform.localScale,
                                                    psr.transform.localRotation,
                                                    psr.transform.parent));
        }
        GUILayout.EndHorizontal();
        for (int i = 0; i < psr.pss.Count; ++i)
        {
            GUILayout.BeginHorizontal();
            GUILayout.Label(i.ToString());
            psr.pss[i] = new PosStateRecord.PosState(EditorGUILayout.TextField(psr.pss[i].name), psr.pss[i]);
            if (GUILayout.Button("Reset"))
            {
                Undo.RegisterUndo(psr, "redefine state");
               
                    psr.pss[i] = new PosStateRecord.PosState(psr.pss[i].name,
                                                         psr.transform.localPosition,
                                                         psr.transform.localScale,
                                                         psr.transform.localRotation,
                                                         psr.transform.parent);
               
            }
            if (GUILayout.Button("GPS"))
            {
                psr.location(psr.pss[i]);
            }
            if (GUILayout.Button("Delete"))
            {
                Undo.RegisterUndo(psr, "del state");
                psr.pss.RemoveAt(i);
                //if (EditorUtility.DisplayDialog("注意",
                //                           "不可逆操作硬爆,刪除就回不來(lái)了古瓤。是的Ctrl+Z也回不來(lái)!",
                //                           "確定刪除", "放棄刪除"))
                //{
                //    psr.pss.RemoveAt(i);
                //}
            }
            GUILayout.EndHorizontal();
        }
        GUILayout.EndVertical();
        if (isShowDef)
        {
            DrawDefaultInspector();
        }
    }

    bool nameCheck(string _name)
    {
        if (_name == null || _name.Length <= 0)
        {
            return false;
        }
        return true;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市亮靴,隨后出現(xiàn)的幾起案子馍盟,更是在濱河造成了極大的恐慌,老刑警劉巖茧吊,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贞岭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡搓侄,警方通過(guò)查閱死者的電腦和手機(jī)瞄桨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)讶踪,“玉大人芯侥,你說(shuō)我怎么就攤上這事∪榧ィ” “怎么了筹麸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)雏婶。 經(jīng)常有香客問(wèn)我物赶,道長(zhǎng),這世上最難降的妖魔是什么留晚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任酵紫,我火速辦了婚禮,結(jié)果婚禮上错维,老公的妹妹穿的比我還像新娘奖地。我一直安慰自己,他們只是感情好赋焕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布参歹。 她就那樣靜靜地躺著,像睡著了一般隆判。 火紅的嫁衣襯著肌膚如雪犬庇。 梳的紋絲不亂的頭發(fā)上僧界,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音臭挽,去河邊找鬼捂襟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛欢峰,可吹牛的內(nèi)容都是我干的葬荷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼纽帖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宠漩!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起懊直,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤哄孤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后吹截,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凝危,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年波俄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛾默。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懦铺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出支鸡,到底是詐尸還是另有隱情冬念,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布牧挣,位于F島的核電站急前,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瀑构。R本人自食惡果不足惜裆针,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寺晌。 院中可真熱鬧世吨,春花似錦、人聲如沸呻征。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)陆赋。三九已至沐祷,卻和暖如春嚷闭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背戈轿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工凌受, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人思杯。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓胜蛉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親色乾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子誊册,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 最近發(fā)現(xiàn)自己總是睡不好,每天醒得很早暖璧,醒來(lái)之后腦袋里就不停地轉(zhuǎn)動(dòng)案怯,在腦袋里播放的全是一些無(wú)關(guān)緊要的事,而且這樣的行...
    文字海洋里的一條魚(yú)閱讀 163評(píng)論 0 1
  • 『把大象放到冰箱里澎办,需要哪三步嘲碱?』——這是源于春晚小品的一個(gè)段子。 如果我們用編程語(yǔ)言Java來(lái)表達(dá)這個(gè)過(guò)程局蚀,那么...
    匿蟒閱讀 3,412評(píng)論 1 4
  • 手繪鑒賞 · 豆?jié){油條 作者:多一顆檸檬 法律 · 如果我被“兩規(guī)”,我會(huì)怎么辦千扶? 作者:搬磚的蘆花 我曾是反貪局...
    簡(jiǎn)黛玉閱讀 7,694評(píng)論 6 74
  • 她坐在燈下料祠,拿著書(shū)看著。眼睛看著書(shū)澎羞,卻什么都沒(méi)有看進(jìn)去髓绽。已經(jīng)翻過(guò)去好幾頁(yè)了,可是看的什么內(nèi)容妆绞,她根本就不知道梧宫,只是...
    一縷情絲閱讀 268評(píng)論 0 4
  • 這周是我的陪護(hù)假第二周,一直在家里照顧妻子和孩子摆碉,還有做些家務(wù)塘匣。沒(méi)有執(zhí)行之前制定的計(jì)劃。 明天25號(hào)周一開(kāi)始正式上...
    KUNGFUBUNNY閱讀 131評(píng)論 0 1