Unity 自制工具:Point。方便标记出生点或巡逻点等功能。

5 篇文章 0 订阅

Unity 自制工具:Point。方便标记出生点或巡逻点等功能。

之前的一篇点的封装:Unity 实现出生点(Spawn Points)的Scriptable封装
工具源码:Point For Unity

  如上链接,之前封装过一次点对象,但觉得易用性还不是那么好,在使用cinemachine插件后,发现其相机轨道到waypoint控制很不错,所以就抄袭了一些代码,重新实现点的封装,并添加了一些常用随机区域出生点工具(环状、球状、立方体状等)。


Point(点)

定义:只有位置和旋转角度两个属性的类对象。

[System.Serializable]
public class Point
{
    public Vector3 position;
    public Vector3 eulerAngles;
    public Quaternion rotation { get { return Quaternion.Euler(eulerAngles); } set { eulerAngles = value.eulerAngles; } }

    public Point() { }
    public Point(Vector3 position, Quaternion rotation) { this.position = position; this.rotation = rotation; }
    public Point(Vector3 position, Vector3 eulerAngles) { this.position = position; this.eulerAngles = eulerAngles; }
}

Points(点列表)


直接点击Gizmos可以选中点列表,控制Appearance来更方便控制点的位置角度。


点击按钮可以直接聚焦到对应的点。选择移动或旋转工具,可以直接在场景中控制点的位置已经旋转角度。


可以控制transform的位置和旋转来改变所有点的位置。除了缩放对所有点没有任何影响。

变量名说明
Appearance外观。对点没有实际影响。
Keep Gizmos在点列表对象没有选择时,仍然保持显示Gizmos。
Use Screen Size使用屏幕尺寸显示点。打勾后所有点大小都会保持一致,不管镜头在什么位置。
Axis Length每个点三个虚拟轴的长度。
Focus Size在下方每个点项按钮点击时,会对焦到对应的点,这个变量是控制对焦后场景大小。
Current Index当前点索引,用于函数中的变量,对应点列表索引。
Looped是否循环,在调用GetNextPoint()时,如果当前是最后一个点,会重新跳到第一个点。
Points Details点列表。前面两条杠拖拽可以控制点的顺序。按钮用于对焦选择点。直接点击这一项即是选中该点(可以在场景中点击)。

实例1.在每个点同时作为出生点和巡逻点


    public Points points;

    // 作为出生点。因为定义了索引器,所以直接使用points[i]就代表索引为i对应的点。
    private void Start()
    {
        Point worldSpacePoint;
        for (int i = 0; i < points.Count; i++)
        {
            chickenList.Add(Instantiate(prefab, transform).GetComponent<ChickenManager>());
            //其中GetWorld***()的方法是获取世界坐标下的点,因为该点列表是基于GameObject的Transform的。
            worldSpacePoint = points.GetWorldSpacePoint(points[i]);
            chickenList[i].transform.position = worldSpacePoint.position;
            chickenList[i].transform.rotation = worldSpacePoint.rotation;
        }
    }

    // 作为巡逻点。如果没有勾选Looped,那么在最后一个点调用GetNextPoint()将是为null。
    private void Update()
    {
        elapsed -= Time.deltaTime;
        if (elapsed <= 0)
        {
            nextPoint = points.GetNextPoint();
            if (nextPoint != null)
                for (int i = 0; i < chickenList.Count; i++)
                    chickenList[i].SetNextWayPoint(points.GetWorldPosition(nextPoint));
            elapsed = changeNextWayPointTime;
        }
    }

Annulus Area(环状区域)


可在场景直接拖拽缩放杆,来控制区域大小,控制angle来控制区域的扇形面积。


同样可以控制Transform来控制区域的位置,同样不受缩放影响。

变量名说明
Orientation Type点的方向。如下面的图。
Orientation Euler Angle点方向角度。仅对类型Same和Rule有效。
Appearance外观。
Angle扇形面积的角度。
MinRadius区域最小半径。
MaxRadius区域最大半径。

Qrientation Type

  1. Same,获取的点旋转角都相同。

  2. Rule,有规律的。
      实际就是一条代码,orientationAngle * Quaternion.LookRotation(offset) ,orientationAngle是点方向角度,offset就是点相对圆心的位置偏移量。

    2.1. 角度为0,所有点相对圆心向外。

    2.2. y为180,所有点相对圆心向内。

    2.3. y为90,所有点从上往下看是顺时针方向。

  3. Random,随机方向。不受角度输入影响。

实例2.环状区域中(或边缘)随机产生超载鸡们。

    private void ResetChicken(ChickenManager c)
    {
        // 判断是否打勾inEgde来判断产生位置(已经转换到世界坐标)。
        temP = inEgde ? area.GetRandomPointInEdge() : area.GetRandomPointInArea();
        c.transform.position = temP.position;
        c.transform.rotation = temP.rotation;
        c.autoMoveForward = autoMove;
    }

Sphere Area(球状区域)


继承于Annulus Area,原理相同,但是不支持角度控制,因为光想想怎么绘制出被裁切的球体就觉得很麻烦。

实例3.球状区域中随机产生超载鸡们。


Cube Area (立方体区域)


这个更简单,只有一个区域范围控制。


同样可以通过transform改变位置旋转,而且支持修改缩放控制大小。

实例4.立方体区域中随机产生超载鸡们。


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值