找回密码
 立即注册
查看: 169|回复: 0

Unity 屏幕射线ScreenPointToRay

[复制链接]
发表于 2022-12-27 11:20 | 显示全部楼层 |阅读模式
如下图所示,点击屏幕时,会生成一条射线,从摄像机的的位置开始,指向屏幕点击的地方,射线继续往前,会穿透绿色的正方体,对应的点就是该屏幕坐标对应的世界坐标

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-9 09:27 , Processed in 0.097656 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表