using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
射线是虚拟的或者说场景中看不见的线,它从一些原点开始并指定方向延伸出去
使用命令ScreenPointToRay来发射
鼠标拾取是在3D场景中挑选出鼠标光标下对象的行为
*/
public class RayShooter : MonoBehaviour {
private Camera _camera;
// Use this for initialization
void Start () {
_camera = GetComponent<Camera>();
Cursor.lockState = CursorLockMode.Locked;//隐藏光标
Cursor.visible = false;
}
// Update is called once per frame
void Update () {
//Input.GetMouseButtonDown()方法是返回true还是false 这取决与鼠标是否被单击了
if (Input.GetMouseButtonDown(0))
{
//屏幕中心是宽高的一半
Vector3 point = new Vector3(_camera.pixelWidth/2,_camera.pixelHeight/2,0);
//point屏幕中心点
Ray ray = _camera.ScreenPointToRay(point);//发射一条通过屏幕中心的射线
RaycastHit hit;
//Raycast给引用的变量填充信息
if (Physics.Raycast(ray,out hit))
{
//Debug.Log("Hit"+hit.point);
//运行协成来响应击中
// 1 StartCoroutine(SphereIndicator(hit.point));
/*
协成不是异步的(异步操作不会停止正在运行的代码)
StartCoroutine()启动一个协成,一旦协成启动,它保持运行直到函数结束
它只是在运行过程中暂停。调用的方法一直运行直到它遇到yield命令,则函数暂停
*/
//print("1");
GameObject hitObject = hit.transform.gameObject;//获取射线击中的对象
//使用对象的GetComponent()方法来检测它是否是一个反应的目标
ReactiveTarget target = hitObject.GetComponent<ReactiveTarget>();
if (target != null)
{
// Debug.Log("Target hit");
target.ReactToHit();
}
else
{
StartCoroutine(SphereIndicator(hit.point));
}
}
}
}
private IEnumerator SphereIndicator(Vector3 pos)
{
GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
sphere.transform.position = pos;
yield return new WaitForSeconds(3);
//移除GameObject并清除它占用的内存
Destroy(sphere);
}
/*
渲染是计算机绘制3D场景的像素的行为,虽然场景使用XYZ坐标定义,
但真正显示在显示器上的是2D颜色像素格子。因此为了显示3D场景
计算机需要在2D格子中计算所有像素的颜色,运行的这种算法称为渲染
*/
private void OnGUI()
{
int size = 12;
float posX = _camera.pixelWidth / 2 - size / 4;
float posY = _camera.pixelHeight / 2 - size / 2;
GUI.Label(new Rect(posX,posY,size,size),"*");
}
}