笔记18 面试题:吸附
图片说明
代码:移动物体、垂直地面、吸附到Cube中心
public class CubeTest : MonoBehaviour {
//来一个布尔值
private bool isMove;
void Start () {
}
void Update () {
//如果移动
if(isMove)
{
//射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//拿到射线的结构体
RaycastHit hit;
//进行射线检测。如果没有指定层,会看到物体逐渐靠近屏幕。
//使用了层,那么必须写上前面那个表示距离的参数(500f),以避免层失效。
bool res = Physics.Raycast(ray, out hit, 500f, 1<<8);
if (res)
{
//为真,则位置等于点击的位置。
transform.position = hit.point;
//如果出现问题,可将法线画出
//Debug.DrawRay(hit.point, hit.normal, Color.red);
//因为Player是垂直于平面的,所以让它看向碰撞点的法线(一个向量)
transform.rotation = Quaternion.LookRotation(hit.normal);
/*看向一个向量,就是说其Z轴(因为Z轴表示前方)和向量的方向保持一致。
所以,使用此方法时,要保证Player的Z轴(本地座标)是朝上的
区别于transform.LookAt(Vector3.zero);是看向某一点,例如相机看向汽车。
另一个方法:
碰撞点向上的方向等于碰撞点法线的方向。好处:不需要修改细长方块的本地旋转。
transform.up = hit.normal;
*/
}
//判断附近有没有大方块。范围:中心点transform.position,半径1米的圆
Collider[] colliders = Physics.OverlapSphere(transform.position, 1f);
//遍历碰撞体
foreach(Collider collider in colliders)
{
//做判断:如果碰撞器的标签是Taget(之前将方块的标签改为了Taget)
if (collider.tag == "Target")
{
//便将我的位置等于方块的中心点的位置
transform.position = collider.transform.position;
}
}
}
}
private void OnMouseDown()
{
//isMove表示是否能移动。在这里设置为true
isMove = true;
}
private void OnMouseUp()
{
isMove = false;
}
}