赞
踩
Unity 自制工具:Point。方便标记出生点或巡逻点等功能。
之前的一篇点的封装:Unity 实现出生点(Spawn Points)的Scriptable封装
工具源码:Point For Unity
如上链接,之前封装过一次点对象,但觉得易用性还不是那么好,在使用cinemachine插件后,发现其相机轨道到waypoint控制很不错,所以就抄袭了一些代码,重新实现点的封装,并添加了一些常用随机区域出生点工具(环状、球状、立方体状等)。
定义:只有位置和旋转角度两个属性的类对象。
[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; }
}
直接点击Gizmos可以选中点列表,控制Appearance来更方便控制点的位置角度。
点击按钮可以直接聚焦到对应的点。选择移动或旋转工具,可以直接在场景中控制点的位置已经旋转角度。
可以控制transform的位置和旋转来改变所有点的位置。除了缩放对所有点没有任何影响。
变量名 | 说明 |
---|---|
Appearance | 外观。对点没有实际影响。 |
Keep Gizmos | 在点列表对象没有选择时,仍然保持显示Gizmos。 |
Use Screen Size | 使用屏幕尺寸显示点。打勾后所有点大小都会保持一致,不管镜头在什么位置。 |
Axis Length | 每个点三个虚拟轴的长度。 |
Focus Size | 在下方每个点项按钮点击时,会对焦到对应的点,这个变量是控制对焦后场景大小。 |
Current Index | 当前点索引,用于函数中的变量,对应点列表索引。 |
Looped | 是否循环,在调用GetNextPoint()时,如果当前是最后一个点,会重新跳到第一个点。 |
Points Details | 点列表。前面两条杠拖拽可以控制点的顺序。按钮用于对焦选择点。直接点击这一项即是选中该点(可以在场景中点击)。 |
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;
}
}
可在场景直接拖拽缩放杆,来控制区域大小,控制angle来控制区域的扇形面积。
同样可以控制Transform来控制区域的位置,同样不受缩放影响。
变量名 | 说明 |
---|---|
Orientation Type | 点的方向。如下面的图。 |
Orientation Euler Angle | 点方向角度。仅对类型Same和Rule有效。 |
Appearance | 外观。 |
Angle | 扇形面积的角度。 |
MinRadius | 区域最小半径。 |
MaxRadius | 区域最大半径。 |
Same,获取的点旋转角都相同。
Rule,有规律的。
实际就是一条代码,orientationAngle * Quaternion.LookRotation(offset)
,orientationAngle是点方向角度,offset就是点相对圆心的位置偏移量。
2.1. 角度为0,所有点相对圆心向外。
2.2. y为180,所有点相对圆心向内。
2.3. y为90,所有点从上往下看是顺时针方向。
Random,随机方向。不受角度输入影响。
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;
}
继承于Annulus Area,原理相同,但是不支持角度控制,因为光想想怎么绘制出被裁切的球体就觉得很麻烦。
这个更简单,只有一个区域范围控制。
同样可以通过transform改变位置旋转,而且支持修改缩放控制大小。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。