射线发射子弹

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),"*");
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值