csdn 这垃圾工具, 一保存就丢内容!!!
https://github.com/SunGuangdong/Field-of-View
https://www.youtube.com/watch?v=rQG9aUWarwE (共3个)
测试场景这样的 , 橙色Cube 几个, 设置他们的 Layer 为 Obstacles。
蓝色 Capsule 几个, 设置他们的 Layer 为
Targets。

白色
Obstacles 作为角色。
先弄第一个脚本 挂在 Character 上: 控制方向和旋转!!!
using
UnityEngine;
///
<summary>
///
控制角色移动
///
</summary>
public
class
Controller
:
MonoBehaviour
{
///
<summary>
///
移动速度
///
</summary>
public
float
moveSpeed = 6;
Rigidbody
rb;
Camera
viewCamera;
Vector3
velocity;
void
Start
()
{
rb = GetComponent<
Rigidbody
>();
viewCamera =
Camera
.main;
}
void
Update
()
{
// 鼠标位置控制 角色朝向
Vector3
mousePos = viewCamera.ScreenToWorldPoint(
new
Vector3
(
Input
.mousePosition.x,
Input
.mousePosition.y, viewCamera.transform.position.y));
transform.LookAt(mousePos +
Vector3
.up * transform.position.y);
// 方向键控制移动
velocity =
new
Vector3
(
Input
.GetAxisRaw(
"Horizontal"
), 0,
Input
.GetAxisRaw(
"Vertical"
)).normalized * moveSpeed;
}
void
FixedUpdate
()
{
rb.MovePosition(rb.position + velocity *
Time
.fixedDeltaTime);
}
}
|
然后 开始另外一个脚本组件, 先画一个圆
using
System.Collections;
using
System.Collections.Generic;
using
UnityEngine;
public
class
FieldOfView
:
MonoBehaviour
{
///
<summary>
///
圆半径
///
</summary>
public
float
viewRadius;
///
<summary>
///
视野 角度
///
</summary>
[
Range
(0, 360)]
public
float
viewAngle;
///
<summary>
///
根据角度得到 方向单位向量(极坐标 x=sin(a), z=cos(a))
///
</summary>
///
<param name="
angleInDegrees
"></param>
///
<param name="
angleIsGlobal
"></param>
///
<returns></returns>
public
Vector3
DirFromAngle(
float
angleInDegrees,
bool
angleIsGlobal)
{
// 相对自身的?
if
(!angleIsGlobal)
{
angleInDegrees += transform.eulerAngles.y;
}
return
new
Vector3
(
Mathf
.Sin(angleInDegrees *
Mathf
.Deg2Rad), 0,
Mathf
.Cos(angleInDegrees *
Mathf
.Deg2Rad));
}
}
|
using
UnityEditor;
using
UnityEngine;
[
CustomEditor
(
typeof
(
FieldOfView
))]
public
class
FieldOfViewEditor
:
Editor
{
void
OnSceneGUI
()
{
FieldOfView
fow = (
FieldOfView
)target;
Handles
.color =
Color
.white;
// 画一个圆
Handles
.DrawWireArc(fow.transform.position,
Vector3
.up,
Vector3
.forward, 360, fow.viewRadius);
// 视野的两条线
Vector3
viewAngleA = fow.DirFromAngle(-fow.viewAngle / 2,
false
);
Vector3
viewAngleB = fow.DirFromAngle(fow.viewAngle / 2,
false
);
Handles
.DrawLine(fow.transform.position, fow.transform.position + viewAngleA * fow.viewRadius);
Handles
.DrawLine(fow.transform.position, fow.transform.position + viewAngleB * fow.viewRadius);
}
}
|
回到场景中, 不要Play,就在编辑器 状态下, 选中 Character 角色。 圆 和直线
然后添加碰撞检测相关的代码(障碍 和 目标):
using
System.Collections;
using
System.Collections.Generic;
using
UnityEngine;
public
class
FieldOfView
:
MonoBehaviour
{
///
<summary>
///
圆半径
///
</summary>
public
float
viewRadius;
///
<summary>
///
视野 角度
///
</summary>
[
Range
(0, 360)]
public
float
viewAngle;
///
<summary>
///
目标层
///
</summary>
public
LayerMask
targetMask;
///
<summary>
///
障碍层
///
</summary>
public
LayerMask
obstacleMask;
///
<summary>
///
在视野内能看到的目标
///
</summary>
[
HideInInspector
]
public
List
<
Transform
> visibleTargets =
new
List
<
Transform
>();
void
Start
()
{
StartCoroutine(FindTargetsWithDelay(.2f));
}
IEnumerator
FindTargetsWithDelay(
float
delay)
{
|