|
如下图所示,点击屏幕时,会生成一条射线,从摄像机的的位置开始,指向屏幕点击的地方,射线继续往前,会穿透绿色的正方体,对应的点就是该屏幕坐标对应的世界坐标
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 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|