如何通过已知道的坐标获取物体&动态生成墙壁
获得物体有几种方式:
1.通过父物体,遍历其子物体
2.通过GameObject.Find("物体名称")
3..通过GameObject.FindWithTag("物体标签名称")
4.通过射线检测
如果有大量相同(相同标签物体过多)的物体,采取方法1,2,3是行不通的,计算量太大
那么就可以通过第4种方法 射线检测,
一个房间里面 X,Y,Z 的3种坐标的一般,x/2,y/2, z/2的坐标 即是虚拟的标记点。
先声明
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
(图1大图)
void OnDrawGizmos()//画一个立方体,用于判断这个 孵化器 的范围
{
#if UNITY_EDITOR
Gizmos.color = Color.blue;//红线
Gizmos.DrawLine(transform.position, dirX);
Gizmos.DrawLine(transform.position, dirX_);
Gizmos.color = Color.green;//红线
Gizmos.DrawLine(transform.position, dirY);
Gizmos.DrawLine(transform.position, dirY_);
Gizmos.color = Color.black;//红线
Gizmos.DrawLine(transform.position, dirZ);
Gizmos.DrawLine(transform.position, dirZ_);
Gizmos.color = Color.red;//红线
Gizmos.DrawSphere(transform.position, 1);//描述:用在transform.position绘制一个大小为2绘制一个球体.
Gizmos.DrawWireCube(transform.position, this.transform.localScale);// 描述:用transform.position和this.transform.localScale绘制一个线框立方体.
Handles.Label(transform.position, "Room Wall Judget");//在transform.position位置 绘制一个"Enemy Spawner"的文本
//handles.label需要下面撒谎那个行作为头文件
//#if UNITY_EDITOR
//using UnityEditor;
//#endif
#endif
}
这个画线的就是UNITY的可视化辅助功能
画线 立方体 的大小是根据 这个 没有实物 的空物体 标记点 的SCALE来长宽高的
(图2大图)(红色方块 和小球都是OnDrawGizmos() 函数表达出来的)
8个点的坐标如下图3所示,根据坐标系的±来判断是否加减。
最右边白色的 P.X , P.Y , P.Z是这个GameObject 的Transform坐标,Scene视图里面 这个红色 圆球 标识点 的物体,
最右边黑色的 S.X , S.Y, S.Z是这个GameObject的Scale大小
(图3大图)
标识点的红色立方体框框 的长宽高为S.X = 11,S.Y = 3, S.Z = 8。长宽高表示有误差,以自己的标准为主
一个房间里面 四周的墙壁
从A1点坐标到 A4坐标 间隔 为 1半个 单位长度,为 坐标数组 终点A14
target.position为 标识点 的坐标
dirV为 从标识点 发射射线检测的 终点坐标
RaycastHit hit;
if (Physics.Linecast(target.position, dirV, out hit))
{
string tagname = hit.collider.gameObject.tag;
if (tagname != "MainCamera" && tagname != "terrain")
{
if (tagname == "Wall")//如果 碰撞到墙壁,使其透明
{
hit.collider.gameObject.GetComponent<MeshRenderer>().enabled = false;
}//
}//
}//
---------------------------------------------------------------------摄像机 与 立方体物体 的射线 与 平面 的交点, 判断 墙壁是否该透明
(图4大图)
public Transform target;//玩家操控 的 人物
public GameObject BaseWall;//基础墙壁
int leng = 10;//向量坐标 长度
float posx;//物体 坐标X,Y,Z
float posy;
float posz;
float scalx;
float scaly;
float scalz;
Vector3 dirX;//6个方向的向量
Vector3 dirX_;
Vector3 dirY;
Vector3 dirY_;
Vector3 dirZ;
Vector3 dirZ_;
Vector3 A1;
Vector3 A2;
Vector3 A3;
Vector3 A4;
Vector3 B1;
Vector3 B2;
Vector3 B3;
Vector3 B4;
void Start ()
{
Debug.Log("2");
maincamera = GameObject.Find("Main Camera").transform;//找到 主摄像机
// Debug.DrawLine(transform.position, PCube.transform.position, Color.green);//Debug.DrawLine(ray.origin, hit.point, Color.green);
posx = transform.position.x; posy = transform.position.y; posz = transform.position.z;
//Debug.DrawLine(transform.position, transform.position + new Vector3(1,0,0), Color.red);
//new Vector3(maincamera.position.x,target.transform.position.y,maincamera.position.z);
dirX = new Vector3(posx + leng, posy, posz);
dirX_ = new Vector3(posx - leng, posy, posz);
dirY = new Vector3(posx, posy + leng, posz);
dirY_ = new Vector3(posx, posy - leng, posz);
dirZ = new Vector3(posx, posy, posz + leng);
dirZ_ = new Vector3(posx, posy, posz - leng);
scalx = transform.localScale.x / 2;
scaly = transform.localScale.y / 2;
scalz = transform.localScale.z / 2;
A1 = new Vector3(posx + scalx, posy + scaly, posz - scalz);
A2 = new Vector3(posx + scalx, posy + scaly, posz + scalz);
A3 = new Vector3(posx - scalx, posy + scaly, posz + scalz);
A4 = new Vector3(posx - scalx, posy + scaly, posz - scalz);