TheLudGamer 发表于 2022-12-27 11:20

Unity 屏幕射线ScreenPointToRay

如下图所示,点击屏幕时,会生成一条射线,从摄像机的的位置开始,指向屏幕点击的地方,射线继续往前,会穿透绿色的正方体,对应的点就是该屏幕坐标对应的世界坐标
image.png

测试脚本如下:
using UnityEngine;public class RayDemo : MonoBehaviour{    private int x = 10; // 宽度    private int y = 5; // 高度    private Ray ray;// 射线    private RaycastHit hit; // 碰撞信息   public GameObject prefabBrick;// 砖块【将一个正方体拖拽成预制体,记得添加rigdbody组件】    public GameObject prefabBullet; // 子弹【将一个球拖拽成预制体,记得添加rigdbody组件】    public Transform parent;//存放正方体的父物体    private Transform m_Transform;    Vector3 hitpoint = Vector3.zero;    void Start()    {      m_Transform = gameObject.GetComponent<Transform>();      CreateWall();    }    void Update()    {      SendBullet();    }    /// <summary>    /// for循序生成墙壁(颜色随机产生)    /// </summary>    void CreateWall()    {      for (int i = 0; i < x; i++)      {            for (int j = 0; j < y; j++)            {                Vector3 p = new Vector3(i - 4, j, 0);                // 生成墙壁(prefabBrick:砖块预制体)                GameObject go = GameObject.Instantiate(prefabBrick, p, Quaternion.identity, parent);                // 随机控制颜色                go.GetComponent<MeshRenderer>().material.color = new Color(Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f));            }      }    }    /// <summary>    /// 发射子弹    /// </summary>    void SendBullet()    {      // 按下鼠标左键发射射线      if (Input.GetMouseButtonDown(0))      {            // 使用主摄像机创建一根射线,射线的方向是鼠标点击的位置(从摄像头位置到鼠标点击位置的一条射线)            Vector3 screenPoint = Input.mousePosition;            ray = Camera.main.ScreenPointToRay(screenPoint);            // 使用物理类检查射线的碰撞,如果点击物体存在            if (Physics.Raycast(ray, out hit))            {                // 实例化子弹(prefabBullet:子弹预制体)                GameObject go = GameObject.Instantiate(prefabBullet, m_Transform.position, Quaternion.identity);                // 计算方向                  // hit.point:碰撞点坐标                  // m_Transform.position:摄像机坐标 两者相减得方向                Vector3 dir = hit.point - m_Transform.position;                hitpoint = hit.point;                // 发射子弹(Rigidbody.AddForce)                go.GetComponent<Rigidbody>().AddForce(dir * 110);            }      }      Debug.DrawRay(transform.position, hitpoint - transform.position, Color.red);    }}
Demo链接: https://pan.baidu.com/s/1rbRCtq_ukwVmNs0woJAeMA 提取码: mjok
页: [1]
查看完整版本: Unity 屏幕射线ScreenPointToRay