1 脚本 scene场景中显示
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RayCast : MonoBehaviour {
private List<GameObject> hitGObs;
// Use this for initialization
void Start () {
hitGObs = new List<GameObject>();
hitGObs.Clear ();
}
// Update is called once per frame
void Update () {
//如果写为transform.forward则表示线是无限长
Ray ray=new Ray(transform.position,transform.forward*100); //定义一个射线对象,包含射线发射的位置transform.position,发射距离transform.forward*100;
Debug.DrawLine(transform.position,transform.position+transform.forward*100,Color.red); //这个就是绘制出的射线了,包含发射位置,发射距离和射线的颜色;
RaycastHit hitInfo; //定义一个RaycastHit变量用来保存被撞物体的信息;
if (Physics.Raycast (ray, out hitInfo, 100)) { //如果碰撞到了物体,hitInfo里面就包含该物体的相关信息;
//hitInfo.point:碰撞点的位置;
//hitInfo.normal:与碰撞点所在平面垂直的向量;
//hitInfo.collider.gameobject:可以得到该物体上的所有信息了;
GameObject hitme = hitInfo.collider.gameObject;
//print (hitme.gameObject);
hitme.GetComponent<MeshRenderer> ().material.color = Color.red;
//put the hitting objects into the array:hitGObs,以便使其颜色能回到以前的状态
hitGObs.Add(hitme);
} else {
foreach (var item in hitGObs) {
item.GetComponent<MeshRenderer> ().material.color = Color.white;
//hitGObs.Clear ();
}
}
}
}
2,unity其他设置
3,运行后在Scene中拖动物体可以看到当射线碰到物体时会变成红色。
4,scene 和game场景中都有射线,scene中只看到射线与物体碰到时的圆点。
Ray Constructor
// Create a ray from the transform position along the transform's z-axis Ray ray = new Ray(transform.position, transform.forward);
Debug.DrawLine(Vector3.zero, new Vector3(1, 0, 0), Color.red);
RayScene.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RayScene : MonoBehaviour {
public LineRenderer linerenderer;
private List<GameObject> hitGObs;
private GameObject line;
// Use this for initialization
void Start () {
//linerenderer = GetComponent<LineRenderer>();
//linerenderer.SetVertexCount(2);
line = new GameObject();
line = GameObject.Find ("Line");
line.GetComponent<LineRenderer> ().enabled = false;
hitGObs = new List<GameObject>();
hitGObs.Clear ();
}
// Update is called once per frame
void Update () {
//如果写为transform.forward则表示线是无限长
Ray ray=new Ray(transform.position,transform.forward*100); //定义一个射线对象,包含射线发射的位置transform.position,发射距离transform.forward*100;
//drawline in the scene
Debug.DrawLine(transform.position,transform.position+transform.forward*100,Color.red); //这个就是绘制出的射线了,包含发射位置,发射距离和射线的颜色;
RaycastHit hitInfo; //定义一个RaycastHit变量用来保存被撞物体的信息;
if (Physics.Raycast (ray, out hitInfo, 100)) { //如果碰撞到了物体,hitInfo里面就包含该物体的相关信息;
//hitInfo.point:碰撞点的位置;
//hitInfo.normal:与碰撞点所在平面垂直的向量;
//hitInfo.collider.gameobject:可以得到该物体上的所有信息了;
DrawLineInGame (hitInfo.point);
GameObject hitme = hitInfo.collider.gameObject;
//print (hitme.gameObject);
hitme.GetComponent<MeshRenderer> ().material.color = Color.green;
//put the hitting objects into the array:hitGObs,以便使其颜色能回到以前的状态
hitGObs.Add(hitme);
} else {
line.GetComponent<LineRenderer> ().enabled = false;
foreach (var item in hitGObs) {
item.GetComponent<MeshRenderer> ().material.color = Color.white;
//hitGObs.Clear ();
}
}
}
void DrawLineInGame (Vector3 point)
{
line.GetComponent<LineRenderer> ().enabled = true;
linerenderer.SetPosition(0, point);
linerenderer.SetPosition(1, point);
linerenderer.startColor = Color.red;
linerenderer.endColor = Color.red;
linerenderer.material = (Material)Resources.Load ("LineColor");
}
}
note:关于linerender的颜色和形状的设置
颜色需要新建材质动态加载不然一直会是粉色的。
或者直接修改其材质组件,新建赋上去就好。
形状修改参数
Scene中拖动物体可以看到当射线碰到物体时会变成绿色
可以设置多个camera在game中不同的视觉看不同风景
运行后效果
7,用spotlight实现,超级简单。
为了实现的效果好一些,物体的颜色最好不要时白色。然后可以通过调节光的强度.....达到预期的效果。
详细的东西可以参考unity自带的文档。
实施获取要到的物体的position and rotation 分别给spotlight的position and rotation.
获取物体的transform,
public GameObject moveObject;
public class gaze : MonoBehaviour {
public GameObject moveObject;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
this.transform.position = moveObject.transform.position;
this.transform.rotation = moveObject.transform.rotation;
}
}
8,把射线交点用红色小球显示出来。
a)添加一个sphere,材质渲染为红色。
b) 在程序中把射线交点的给小球的position.
headPointer.GetComponent<MeshRenderer> ().enabled = true;
这一行控制实现小球是否显示出来。
c)小球的boxcollider和体积不能太大,否正当凝视时,小球回往眼睛的方向跑,应该是对物体添加了碰撞检测后,相当与物体有初速度,如果频繁移动在这个效应可以忽略,但当球的体积比较大(场景的整个比例都很大,则以m为单位,相当于放大了很多倍,只要稍微一碰则初速度会比较大,则小球不会按我们预期的,会在碰撞的地方以一定的初速度做匀速运动。尽量时瞬间碰撞的初速度小,不然没法实现表示注视点的效果。)
d) 更好的解决这个注视点碰撞后匀速运动的方法是把小球的collider去掉。