我正在阅读 Joseph Hawking 的 Unity in Action。我目前在第 3 章,我们正在编写第一人称射击游戏。我不清楚投掷光束的方法是如何实现的(对于投篮的实现,还有几点)。请参阅代码中的注释。请给我解释一下,提前谢谢!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RaySh : MonoBehaviour {
private Camera camera;
// Use this for initialization
void Start () {
camera = GetComponent<Camera>();
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
void OnGUI(){
int size = 12;
float posX = camera.pixelWidth / 2 - size / 4; //зачем здесь вычитается size / 4
float posY = camera.pixelHeight / 2 - size / 2; //зачем здесь вычитается size / 2
GUI.contentColor = Color.black;
GUI.Label(new Rect(posX, posY, size, size), "*");
}
// Update is called once per frame
void Update () {
if(Input.GetMouseButtonDown(0)){ // полностью не понятен метод бросания луча (код ниже)
Vector3 point = new Vector3(camera.pixelWidth / 2, camera.pixelHeight / 2, 0);
Ray ray = camera.ScreenPointToRay(point);
RaycastHit hit;
if(Physics.Raycast(ray, out hit)){
StartCoroutine(SphereIndicator(hit.point));
}
}
}
private IEnumerator SphereIndicator(Vector3 pos){
GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
sphere.transform.position = pos;
yield return new WaitForSeconds(1);
Destroy(sphere);
}
}
void OnGUI(){} 内部发生的是界面元素在屏幕上的呈现。它是一个已弃用的 API,可能会因过时而在未来的版本中被删除。
由于Rect构造函数的特殊性,此处减去了大小。它不是中心和宽度与高度,而是左上角和宽度与高度。结果,为了让图片在屏幕中央,需要用屏幕的一半宽度减去图片宽度的一半,再将图片高度的一半加上屏幕高度的一半.
为什么作者减去两个指标以及为什么宽度除以 4 我不清楚。显然,他想将图像放在中心下方并稍微向右 o.o
接下来,我解释光束本身的投掷。在代码行下方注释。
如果按下 LMB
在这里,我们创建一个等于屏幕中心像素坐标的向量(即,我们将相机的宽度和高度以像素为单位分成两半)。在 Unity 中,这样的向量被认为是 ScreenPoint,即 屏幕像素坐标中某物的位置,而不是世界的。
使用一种特殊的相机方法,我们创建了一条从相机发射到 ScreenPoint 点的射线。该方法被调用,如您所见 -
ScreenPointToRay
。在我们的例子中,我们在屏幕的计算中心发射光束。按照惯例,这是一条射线,它的起点是相机坐标,它将在屏幕中心发射。包含有关光束与任何对撞机的碰撞信息的变量。
使用根据给定设置投射光线并返回 bool 的物理方法 - 光线是否与某个物体发生碰撞。如果发生碰撞,则有关此碰撞的信息将传递给 hit 变量。该方法本身有许多重载,因此您可以从点到点投射光线、使用图层蒙版等等。
启动协程。从名称和签名来看,
(hit.point)
一个球体在与对撞机的碰撞点出现了一段时间。