从零开始的RPG制作4.1(辅助线的统一管理)

在制作中,我们往往需要用到许许多多的辅助线设置,往往分部在不同的脚本中,在这里我们不希望这样,我们希望能够统一进行辅助线的管理,于是我们设计了一个辅助线设置相关类。
DrawGizmosManager:

using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using UnityEngine;
using Object = UnityEngine.Object;
using Debug = UnityEngine.Debug;

[System.Serializable]
public class IDrawGizmos {
    public enum DrawGizmoType {
        Null,
        Cube,
        Sphere,
        Line,
        Ray,
    }
    private DrawGizmoType dgType = DrawGizmoType.Null;
    public DrawGizmoType DgType {
        get {
            return dgType;
        }
    }
    [Header("===== 以下是自身数据相关 =====")]
    Vector3 cubeSize;//方形的长度。
    public Vector3 CubeSize {
        get {
            return cubeSize;
        }
    }

    float radius;//圆形的半径。
    public float Radius {
        get {
            return radius;
        }
    }

    Ray ray;//绘制射线
    public Ray Ray {
        get {
            return ray;
        }
    }

    Vector3 startPostion;//描绘起始点。
    public Vector3 StartPostion {
        get {
            return startPostion;
        }
    }

    Vector3 endPostion;//描绘的终点。
    public Vector3 EndPostion {
        get {
            return endPostion;
        }
    }

    Color drawColor;
    public Color DrawColor {
        get {
            return drawColor;
        }
    }

    int? id;//自身id,用于区分重复创建对象。
    public int? Id {
        get {
            return id;
        }
    }

    [SerializeField]
    bool describe = true;//是否需要描绘
    public bool Describe {
        get {
            return describe;
        }
        set {
            describe = value;
        }
    }

    string caller;//创建这个对象的父节点。
    public string Caller {
        get {
            return caller;
        }
    }

    static public void deleteID (int? id) {
        if (IDrawGizmos.manager != null)
            if (IDrawGizmos.manager.idExists(id) != null) {
                IDrawGizmos.manager.deleteGizmo(id);
            }
    }

    static DrawGizmosManager manager;
    static DrawGizmosManager getDrawGizmosManager () {
        if (IDrawGizmos.manager == null) {
            DrawGizmosManager managerInScene = Object.FindObjectOfType();
            if (managerInScene != null) {
                IDrawGizmos.manager = managerInScene;
            } else {
                GameObject managerObject = new GameObject();
                managerObject.name = "DrawGizmoManager";
                IDrawGizmos.manager = managerObject.AddComponent();
            }
        }
        return IDrawGizmos.manager;
    }

    #region 启用关键段落
    /// 
    /// 绘制一个正方形
    /// 
    /// 原点
    /// 大小
    /// 颜色
    /// 画线ID
    /// 
    static public IDrawGizmos drawCube (Vector3 postion,Vector3 size,Color color,int? kid = null) {
        editor();
        IDrawGizmos.manager = getDrawGizmosManager();
        IDrawGizmos haveIG = null;
        if (kid != null) {//如果画线ID不等于null,就去列表中寻找这个对象,修改内部数值
            haveIG = IDrawGizmos.manager.idExists(kid);
            if (haveIG == null) {//如果不存在这个ID,继续创建一个新的画线对象
                IDrawGizmos idrawgizmos = new IDrawGizmos(DrawGizmoType.Cube,postion,size,color,kid);
                IDrawGizmos.manager.IDrawGizmoListAdd(idrawgizmos);
                return idrawgizmos;
            } else {//如果存在这个ID 修改内部数值。
                if (haveIG.dgType != DrawGizmoType.Cube) {//如果编号相同,类型不同
                    Debug.LogError("这个ID已经被其他类型的辅助线占据,请更换一个ID");
                }
                haveIG.startPostion = postion;
                haveIG.cubeSize = size;
                haveIG.drawColor = color;
                return haveIG;
            }
        } else {//如果画线ID等于null,就不必查找列表,重新创建一个。
            IDrawGizmos idrawgizmos = new IDrawGizmos(DrawGizmoType.Cube,postion,size,color,kid);
            IDrawGizmos.manager.IDrawGizmoListAdd(idrawgizmos);
            return idrawgizmos;
        }
    }

    /// 
    /// 绘制一个圆形
    /// 
    /// 原点
    /// 半径
    /// 颜色
    /// 画线id
    /// 
    static public IDrawGizmos drawSphere (Vector3 postion,float radius,Color color,int? kid = null) {
        editor();
        IDrawGizmos.manager = getDrawGizmosManager();
        IDrawGizmos haveIG = null;
        if (kid != null) {//如果画线ID不等于null,就去列表中寻找这个对象,修改内部数值
            haveIG = IDrawGizmos.manager.idExists(kid);
            if (haveIG == null) {//如果不存在这个ID,继续创建一个新的画线对象
                IDrawGizmos idrawgizmos = new IDrawGizmos(DrawGizmoType.Sphere,postion,radius,color,kid);
                IDrawGizmos.manager.IDrawGizmoListAdd(idrawgizmos);
                return idrawgizmos;
            } else {//如果存在这个ID 修改内部数值。
                if (haveIG.dgType != DrawGizmoType.Sphere) {//如果编号相同,类型不同
                    Debug.LogError("这个ID已经被其他类型的辅助线占据,请更换一个ID");
                }
                haveIG.startPostion = postion;
                haveIG.radius = radius;
                haveIG.drawColor = color;
                return haveIG;
            }
        } else {
            IDrawGizmos idrawgizmos = new IDrawGizmos(DrawGizmoType.Sphere,postion,radius,color,kid);
            IDrawGizmos.manager.IDrawGizmoListAdd(idrawgizmos);
            return idrawgizmos;
        }
    }
    /// 
    /// 绘制一条线段
    /// 
    /// 起始点
    /// 终点
    /// 颜色
    /// 编号
    /// 
    static public IDrawGizmos drawLine (Vector3 postion,Vector3 endPostion,Color color,int? kid = null) {
        editor();
        IDrawGizmos.manager = getDrawGizmosManager();
        IDrawGizmos haveIG = null;
        if (kid != null) {//如果画线ID不等于null,就去列表中寻找这个对象,修改内部数值
            haveIG = IDrawGizmos.manager.idExists(kid);
            if (haveIG == null) {//如果不存在这个ID,继续创建一个新的画线对象
                IDrawGizmos idrawgizmos = new IDrawGizmos(DrawGizmoType.Line,postion,endPostion,color,kid);
                IDrawGizmos.manager.IDrawGizmoListAdd(idrawgizmos);
                return idrawgizmos;
            } else {//如果存在这个ID 修改内部数值。
                if (haveIG.dgType != DrawGizmoType.Line) {//如果编号相同,类型不同
                    Debug.LogError("这个ID已经被其他类型的辅助线占据,请更换一个ID");
                }
                haveIG.startPostion = postion;
                haveIG.endPostion = endPostion;
                haveIG.drawColor = color;
                return haveIG;
            }
        } else {
            IDrawGizmos idrawgizmos = new IDrawGizmos(DrawGizmoType.Line,postion,endPostion,color,kid);
            IDrawGizmos.manager.IDrawGizmoListAdd(idrawgizmos);
            return idrawgizmos;
        }
    }

    static public IDrawGizmos drawRay (Ray ray,Color color,int? kid = null) {
        editor();
        IDrawGizmos.manager = getDrawGizmosManager();
        IDrawGizmos haveIG = null;
        if (kid != null) {//如果画线ID不等于null,就去列表中寻找这个对象,修改内部数值
            haveIG = IDrawGizmos.manager.idExists(kid);
            if (haveIG == null) {//如果不存在这个ID,继续创建一个新的画线对象
                IDrawGizmos idrawgizmos = new IDrawGizmos(DrawGizmoType.Ray,ray,color,kid);
                IDrawGizmos.manager.IDrawGizmoListAdd(idrawgizmos);
                return idrawgizmos;
            } else {//如果存在这个ID 修改内部数值。
                if (haveIG.dgType != DrawGizmoType.Ray) {//如果编号相同,类型不同
                    Debug.LogError("这个ID已经被其他类型的辅助线占据,请更换一个ID");
                }
                haveIG.ray = ray;
                haveIG.drawColor = color;
                return haveIG;
            }
        } else {
            IDrawGizmos idrawgizmos = new IDrawGizmos(DrawGizmoType.Ray,ray,color,kid);
            IDrawGizmos.manager.IDrawGizmoListAdd(idrawgizmos);
            return idrawgizmos;
        }
    }
    #endregion

    IDrawGizmos (DrawGizmoType dgtype,Color color,int? id) {//每个构造函数都需要的部分
        this.dgType = dgtype;
        this.drawColor = color;
        this.id = id;
        StackTrace trace = new StackTrace();
        MethodBase methodName = trace.GetFrame(3).GetMethod();
        caller = methodName.ReflectedType.FullName;//通过反射获取调用者的类名。
    }

    IDrawGizmos (DrawGizmoType dgtype,Vector3 postion,Vector3 sizeOrEnd,Color color,int? id)
        : this(dgtype,color,id) {
        this.startPostion = postion;
        if (dgtype == DrawGizmoType.Cube)
            this.cubeSize = sizeOrEnd;
        else if (dgtype == DrawGizmoType.Line)
            this.endPostion = sizeOrEnd;

    }

    IDrawGizmos (DrawGizmoType dgtype,Vector3 postion,float radius,Color color,int? id)
        : this(dgtype,color,id) {
        this.startPostion = postion;
        this.radius = radius;
    }

    IDrawGizmos (DrawGizmoType dgtype,Ray ray,Color color,int? id)
        : this(dgtype,color,id) {
        this.ray = ray;
    }

    private static void editor () {
        if (Application.platform != RuntimePlatform.WindowsEditor)
            return;
    }
}

public class DrawGizmosManager:MonoBehaviour {

    public List IDrawGizmoList = new List();
    public void IDrawGizmoListAdd (IDrawGizmos idg) {
        IDrawGizmoList.Add(idg);
    }

    public void deleteGizmo (int? id) {
        for (int i = 0;i < IDrawGizmoList.Count;i++) {
            if (IDrawGizmoList[i].Id == id) {
                IDrawGizmoList.RemoveAt(i);
                return;
            }
        }
    }

    public IDrawGizmos idExists (int? id) {//检验ID是否存在
        if (IDrawGizmoList != null) {

            foreach (var item in IDrawGizmoList) {
                if (id == item.Id) {
                    return item;
                }
            }
        }
        return null;
    }

    private void OnDrawGizmos () {
        for (int i = 0;i < IDrawGizmoList.Count;i++) {
            IDrawGizmos ig = IDrawGizmoList[i];
            if (!ig.Describe)
                continue;
            switch (ig.DgType) {
                case IDrawGizmos.DrawGizmoType.Cube:
                    onDrawCube(ig.StartPostion,ig.CubeSize,ig.DrawColor);
                    break;
                case IDrawGizmos.DrawGizmoType.Sphere:
                    onDrawSphere(ig.StartPostion,ig.Radius,ig.DrawColor);
                    break;
                case IDrawGizmos.DrawGizmoType.Line:
                    onDrawLine(ig.StartPostion,ig.EndPostion,ig.DrawColor);
                    break;
                case IDrawGizmos.DrawGizmoType.Ray:
                    onDrawRay(ig.Ray,ig.DrawColor);
                    break;
            }
        }
    }

    private void onDrawCube (Vector3 potion,Vector3 size,Color color) {
        Gizmos.color = color;
        Gizmos.DrawCube(potion,size);
    }

    private void onDrawSphere (Vector3 potion,float radius,Color color) {
        Gizmos.color = color;
        Gizmos.DrawWireSphere(potion,radius);
    }

    private void onDrawLine (Vector3 from,Vector3 to,Color color) {
        Gizmos.color = color;
        Gizmos.DrawLine(from,to);
    }

    private void onDrawRay (Ray ray,Color color) {
        Gizmos.color = color;
        Gizmos.DrawRay(ray);
    }


    // Use this for initialization
    /* public Transform center;
     public Transform CurveStartPoint_Object;
     public Transform CurveEndPoint_Object;
     Vector3 CurveStartPoint;
     Vector3 CurveEndPoint;
     public List CurvePoints;
     void Start() {


     }

     void Update() {

     }*/



    /*private void OnDrawGizmos() {
        CurveStartPoint = CurveStartPoint_Object.position;
        CurveEndPoint = CurveEndPoint_Object.position;
        CurvePoints.Add(CurveStartPoint);
        for (int i = 0; i < 20; i++) {

            var t = i / (20 - 1.0f);
            var position = (1.0f - t) * (1.0f - t) * CurveStartPoint + 2.0f * (1.0f - t) * t * transform.position + t * t * CurveEndPoint;

            CurvePoints.Add(position);
            Gizmos.DrawCube(position, Vector3.one*0.1f);
        }
        CurvePoints.Add(CurveEndPoint);
        Gizmos.color = Color.red;
        Gizmos.DrawCube(CurveStartPoint, Vector3.one * 0.3f);
        Gizmos.DrawCube(CurveEndPoint, Vector3.one * 0.3f);
    }*/

}

完成之后,在我们的scene视图下就可以看到辅助线的效果了。为了看清效果,我们将小姐姐暂时隐藏起来。


辅助线

上一节
下一节

你可能感兴趣的:(从零开始的RPG制作4.1(辅助线的统一管理))