继续学习之Gizmos in the Scene View的自己写的一个无聊的效果

来源:互联网 发布:linux vim 查找 编辑:程序博客网 时间:2024/06/10 15:17

说明:在 Scene视图 下 利用Gizmos线框 实现了一个 很多个小怪在地图里面 随机 走动 (目前碰到边缘我是让他走回来)

效果图
这里写图片描述

untiy的Hierarchy
这里写图片描述

1 网格 (新建一个空物体 挂test.cs脚本(代码在下面))
2 小怪管理类 (空物体 挂 MoveMgr.cs)
3 小怪 (空物体 挂的是 move)

脚本:test.cs

using UnityEngine;using System.Collections;public class test : MonoBehaviour {    [SerializeField]    public int _totalTime = 60;    [SerializeField]    private float _gravity = -30;    [SerializeField]    private AudioClip _bgm;    [SerializeField]    private Sprite _background;    [SerializeField]    private int _totalColumns = 25;    [SerializeField]    private int _totalRows = 10;    public const float GridSize = 1f;    private readonly Color _normalColor = Color.grey;    private readonly Color _selectedColor = Color.yellow;    public int TotalTime    {        get { return _totalTime; }        set { _totalTime = value; }    }    public float Gravity    {        get { return _gravity; }        set { _gravity = value; }    }    public AudioClip Bgm    {        get { return _bgm; }        set { _bgm = value; }    }    public Sprite Background    {        get { return _background; }        set { _background = value; }    }    public int TotalColumns    {        get { return _totalColumns; }        set { _totalColumns = value; }    }    public int TotalRows    {        get { return _totalRows; }        set { _totalRows = value; }    }    public test Instance { get { return this; } }    // Use this for initialization    void Start ()     {    }    // Update is called once per frame    void Update ()    {    }    //绘制外框    private void GridFrameGizmo(int cols, int rows)    {        Gizmos.DrawLine(new Vector3(0, 0, 0), new Vector3(0, rows *        GridSize, 0));        Gizmos.DrawLine(new Vector3(0, 0, 0), new Vector3(cols *        GridSize, 0, 0));        Gizmos.DrawLine(new Vector3(cols * GridSize, 0, 0), new        Vector3(cols * GridSize, rows * GridSize, 0));        Gizmos.DrawLine(new Vector3(0, rows * GridSize, 0), new        Vector3(cols * GridSize, rows * GridSize, 0));    }    //绘制内部的线条    private void GridGizmo(int cols, int rows)    {        for (int i = 1; i < cols; i++)        {            Gizmos.DrawLine(new Vector3(i * GridSize, 0, 0), new Vector3(i            * GridSize, rows * GridSize, 0));        }        for (int j = 1; j < rows; j++)        {            Gizmos.DrawLine(new Vector3(0, j * GridSize, 0), new            Vector3(cols * GridSize, j * GridSize, 0));        }    }    private void OnDrawGizmos()    {        Color oldColor = Gizmos.color;        Matrix4x4 oldMatrix = Gizmos.matrix;        Gizmos.matrix = transform.localToWorldMatrix;        Gizmos.color = _normalColor;        GridGizmo(_totalColumns, _totalRows);        GridFrameGizmo(_totalColumns, _totalRows);        Gizmos.color = oldColor;        Gizmos.matrix = oldMatrix;    }    private void OnDrawGizmosSelected()    {        Color oldColor = Gizmos.color;        Matrix4x4 oldMatrix = Gizmos.matrix;        Gizmos.matrix = transform.localToWorldMatrix;        Gizmos.color = _selectedColor;        GridFrameGizmo(_totalColumns, _totalRows);        Gizmos.color = oldColor;        Gizmos.matrix = oldMatrix;    }    public Vector3 WorldToGridCoordinates(Vector3 point)    {        Vector3 gridPoint = new Vector3(        (int)((point.x - transform.position.x) / GridSize),        (int)((point.y - transform.position.y) / GridSize), 0.0f);        return gridPoint;    }    public Vector3 GridToWorldCoordinates(int col, int row)    {        Vector3 worldPoint = new Vector3(        transform.position.x + (col * GridSize + GridSize / 2.0f),        transform.position.y + (row * GridSize + GridSize / 2.0f),        0.0f);        return worldPoint;    }    public bool IsInsideGridBounds(Vector3 point)    {        float minX = transform.position.x;        float maxX = minX + _totalColumns * GridSize;        float minY = transform.position.y;        float maxY = minY + _totalRows * GridSize;        return (point.x >= minX && point.x <= maxX && point.y >= minY &&        point.y <= maxY);    }    public bool IsInsideGridBounds(int col, int row)    {        return (col >= 0 && col < _totalColumns && row >= 0 && row < _totalRows);    }}

脚本 :MoveMgr.cs

using UnityEngine;using System.Collections;public class MoveMgr : MonoBehaviour {    [SerializeField]    public int m_count = 10;    public GameObject prefab;    // Use this for initialization    void Start () {        for (int i = 0; i < m_count; i++)        {            GameObject.Instantiate(prefab);        }    }    // Update is called once per frame    void Update () {    }}

脚本:move.cs

using UnityEngine;using System.Collections;public class move : sixsixsix {    //方向数组 上下左右    private Vector3[] m_direction = { new Vector3(0, 1, 0),                                       new Vector3(0, -1, 0),                                    new Vector3(1, 0, 0),                                    new Vector3(-1, 0, 0)                                 };    //当前启动移动的方向    private Vector3 m_currentDirection = Vector3.zero;    // Use this for initialization    public override void Start () {        base.Start();        this.m_pointX = Random.Range(0, this.m_totalColumns+1);        this.m_pointY = Random.Range(0, this.m_totalRows + 1);        this.transform.localPosition = new Vector3(this.m_pointX,this.m_pointY,0);        m_currentDirection = m_direction[Random.Range(0, 4)];     }    // Update is called once per frame    public override void Update () {        base.Update();    }    //每隔一秒运行    public override void MoveOneSecond()    {        if (m_isOverBoder)        {            //如果越界 让它返回            m_currentDirection = -m_currentDirection;            this.transform.localPosition += m_currentDirection;            //返回后重新选择方向            m_currentDirection = m_direction[Random.Range(0, 4)];        }        this.transform.localPosition += m_currentDirection;    }    //三秒改变一个方向    public override void ThreeSecondContorlMove()    {        if (!m_isOverBoder)        {            m_currentDirection = m_direction[Random.Range(0, 4)];        }    }}

脚本 sixsixsix.cs(这是一个基类 简单的封装 可能我封装的很垃圾,学习者慢慢封装吧)

using UnityEngine;using System.Collections;public class sixsixsix : MonoBehaviour {    // Use this for initialization    private test m_t;    protected int m_pointX = 0;    protected int m_pointY = 0;    protected int m_totalColumns;    protected int m_totalRows;    [SerializeField]    protected bool m_isOverBoder;    public virtual void Awake()    {        m_t = GameObject.Find("Grid").GetComponent<test>();        m_totalColumns = m_t.TotalColumns;        m_totalRows = m_t.TotalRows;    }    public virtual void Start()    {        StartCoroutine("Move");        StartCoroutine("ControlMove");    }    // Update is called once per frame    public virtual void Update()    {        Vector3 gridCoord = m_t.WorldToGridCoordinates        (transform.position);        transform.position = m_t.GridToWorldCoordinates((int)gridCoord.x, (int)gridCoord.y);    }    //画每一个物体的样子    private void OnDrawGizmos()    {        Color oldColor = Gizmos.color;        Gizmos.color = (m_t.IsInsideGridBounds(transform.        position)) ? Color.green : Color.red;        Gizmos.DrawCube(transform.position, Vector3.one * test.GridSize);        Gizmos.color = oldColor;        //记录是否出界        m_isOverBoder = !m_t.IsInsideGridBounds(transform.position);    }    IEnumerator Move()    {        while (true)        {            yield return new WaitForSeconds(1);            this.MoveOneSecond();        }    }    IEnumerator ControlMove()    {        while (true)        {            yield return new WaitForSeconds(3);            this.ThreeSecondContorlMove();        }    }    public virtual void MoveOneSecond() { }    public virtual void ThreeSecondContorlMove() { }}

学习了Gizmos这个东西 至少我工作中没用到 我看书中写的主要是用在关卡编辑器上 , 写上面这个东西 我也是随便的一个想法 ,这里做一下笔记

以上代码都有注释 么有的 我的另一边学习Gizmos中有提到 Gizmosde 的一些函数 ,以上基础都是来之《Extending Unity With Editor》,如有错误请告知

0 0
原创粉丝点击