状态记录器(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("状态记录器")]
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("没找到该位置");
        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("没找到该位置");
        return Vector3.zero;
    }

    public Vector3 getLocalScale(string _name)
    {
        foreach (PosState ps in pss)
        {
            if (ps.name.CompareTo(_name) == 0)
            {
                return ps.lcSc;
            }
        }
        Debug.LogError("没找到该缩放");
        return Vector3.one;
    }

    public Quaternion getLocalRotation(string _name)
    {
        foreach (PosState ps in pss)
        {
            if (ps.name.CompareTo(_name) == 0)
            {
                return ps.rt;
            }
        }
        Debug.LogError("没找到该旋转");
        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("没找到该旋转");
        return Quaternion.identity;
    }

    public Transform getParent(string _name)
    {
        foreach (PosState ps in pss)
        {
            if (ps.name.CompareTo(_name) == 0)
            {
                return ps.parent;
            }
        }
        Debug.LogError("没找到该父物体");
        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))] //对UIWidget对象编辑窗进行的重构
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("的状态");
        if (GUILayout.Button("Save"))
        {
            if (!nameCheck(stName))
            {
                EditorUtility.DisplayDialog("错误",
                                            "记录器不允许空名,重名等现象。因为这些名字最后是用来做检索的,取个有意义点的名字吧!以后好找!",
                                            "这就改名");
                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("注意",
                //                           "不可逆操作,删除就回不来了。是的Ctrl+Z也回不来!",
                //                           "确定删除", "放弃删除"))
                //{
                //    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;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • 最近发现自己总是睡不好,每天醒得很早,醒来之后脑袋里就不停地转动,在脑袋里播放的全是一些无关紧要的事,而且这样的行...
    文字海洋里的一条鱼阅读 163评论 0 1
  • 『把大象放到冰箱里,需要哪三步?』——这是源于春晚小品的一个段子。 如果我们用编程语言Java来表达这个过程,那么...
    匿蟒阅读 3,412评论 1 4
  • 手绘鉴赏 · 豆浆油条 作者:多一颗柠檬 法律 · 如果我被“两规”,我会怎么办? 作者:搬砖的芦花 我曾是反贪局...
    简黛玉阅读 7,694评论 6 74
  • 她坐在灯下,拿着书看着。眼睛看着书,却什么都没有看进去。已经翻过去好几页了,可是看的什么内容,她根本就不知道,只是...
    一缕情丝阅读 271评论 0 4
  • 这周是我的陪护假第二周,一直在家里照顾妻子和孩子,还有做些家务。没有执行之前制定的计划。 明天25号周一开始正式上...
    KUNGFUBUNNY阅读 131评论 0 1