作者:励志要成为明星的张佳楠 | 来源:互联网 | 2023-05-19 04:54
1,射线(1)Ray射线Arayisaninfinitelinestartingatoriginandgoinginsomedirection.Ray是具有开始点和方向的无穷
1,射线
(1)Ray射线
A ray is an infinite line starting at origin and going in some direction.
Ray是具有开始点和方向的无穷线。
构造:
Ray ray = new Ray(transform.position, transform.forward);
transform.position为起点, transform.forward为方向。
(2)Raycast射线投射
C#
=> public static bool Raycast(Vector3 sourcePosition, Vector3 targetPosition, out NavMeshHit hit, int areaMask);
sourcePosition:射线起点
targetPosition:射线终点
hit:保存射线投射位置的属性
areaMask:绘制路径时,位掩码指定NavMesh区域中可以被通过的地方。
(3)RaycastHit射线投射碰撞信息
barycentricCoordinate |
The barycentric coordinate of the triangle we hit. 碰到的三角形的重心坐标。 |
collider |
The Collider that was hit. 碰到的碰撞器。 |
distance |
The distance from the ray's origin to the impact point. 从射线的原点到触碰点的距离。 |
lightmapCoord |
The uv lightmap coordinate at the impact point. 在触碰点的UV光照贴图的坐标。 |
normal |
The normal of the surface the ray hit. 射线触碰表面的法线。 |
point |
The impact point in world space where the ray hit the collider. 在世界坐标空间,射线碰到碰撞器的接触点。 |
rigidbody |
The Rigidbody of the collider that was hit. If the collider is not attached to a rigidbody then it is null. 碰到的该碰撞器上的刚体。如果碰撞器上没有附加刚体,那么返回null。 |
textureCoord |
The uv texture coordinate at the impact point. 在触碰点的UV纹理坐标。 |
textureCoord2 |
The secondary uv texture coordinate at the impact point. 在接触点处的第二套UV纹理坐标。 |
transform |
The Transform of the rigidbody or collider that was hit. 碰到的该刚体或碰撞器的变换。 |
triangleIndex |
The index of the triangle that was hit. 碰到的三角形的索引。 |
2,克隆
C#
=> static Object Instantiate(Object original, Vector3 position, Quaternion rotation);
C#
=> static Object Instantiate(Object original);
Parameters
original |
An existing object that you want to make a copy of. 你想要拷贝的已有对象 |
position |
Position for the new object. 新对象的位置 |
rotation |
Orientation of the new object. 新对象的方向 |
Clones the object original and returns the clone. cl
克隆原始物体并返回克隆物体。
以上引自Unity圣典。
3,画线
using UnityEngine;
using System.Collections;
public class Drawwarnline : MonoBehaviour {
// Use this for initialization
private Vector3 pos1;//第一个点的位置
private Vector3 pos2;//第二个点的位置
private RaycastHit hit;
private Ray ray;
private int num = 0;
public bool ischoose;//是否开始画线
public GameObject warnline;//线模型
void Update()
{
if (Input.GetMouseButtonDown(0))//按下鼠标左键
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从主相机投射一条射线到鼠标位置
if (Physics.Raycast(ray,out hit))//在场景中投下可与所有碰撞器碰撞的一条光线。
{
if (hit.collider != null)//碰撞到碰撞器
{
if (!ischoose)
{
pos1 = new Vector3(hit.point.x, hit.point.y, hit.point.z);//记录第一个点坐标
//Debug.Log(pos1);
ischoose = true;
}
else
{
num++;
pos2 = new Vector3(hit.point.x, hit.point.y, hit.point.z);//第二个点坐标
//Debug.Log(pos2);
var distance = Vector3.Distance(pos2, pos1);//两点之间距离,这里var为float类型,使用var,var会自动检测类型
Vector3 direction = (pos2 - pos1).normalized;//要花的线的方向单位向量
GameObject warnobj = GameObject.Instantiate(warnline, (pos2 - pos1) / 2, Quaternion.identity) as GameObject;//克隆警戒线
warnobj.name = "warnline" + num;
warnobj.transform.localScale = new Vector3(100f, 10f, distance * 70);//根据父对象调整大小
warnobj.transform.position = warnobj.transform.position + pos1;//位置
warnobj.transform.forward = direction;
warnobj.transform.parent = GameObject.Find("pwarnline").transform;
//Debug.Log(direction);
ischoose = false;
}
}
}
}
}
}