【unity2D】API-学习记录10-射线投射碰撞信息类RaycastHit2D

目标

学习RaycastHit2D

前言

事实上,UnityAPI里的RaycastHit2D(EN)RaycastHit2D(CN)解释地比较清楚。这里只针对其中较难理解的fraction做些解释。

关于RaycastHit2D-fraction

API对它的解释是这样的

RaycastHit2D.fraction
public float fraction ;

Description
描述
Fraction of the distance along the ray that the hit occurred.
射线上发生命中的距离的分数。

If the ray's direction vector is normalised then this value is simply the distance between the origin and the hit point. 
如果射线的方向矢量是标准化的,则此值只是原点与命中点之间的距离。

If the direction is not normalised then this distance is expressed as a "fraction" (which could be greater than 1) of the vector's magnitude.
如果方向不是标准化的,则此距离表示为矢量大小的“分数”(可以大于 1)。

解释里的最后一句挺不明不白的:

当射线的方向矢量不是标准化的,则此距离表示为矢量大小的“分数”

什么是“矢量大小的‘分数’”

写如下脚本探究:

测试

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FractionTest : MonoBehaviour
{

	Transform trans_1 , trans_2;
	Vector2 pos_1 , pos_2;
	Ray2D ray;
	RaycastHit2D raycast;
	public float distance;

	void Start()
	{
		trans_1 = GetComponent<Transform>();
		trans_2 = GameObject.Find("2").GetComponent<Transform>();  
	}

	void Update()
	{
		if(Input.GetKeyDown(KeyCode.K))//按下K输出相关信息
		{
			pos_1 = new Vector2(trans_1.position.x , trans_1.position.y );

			pos_2 = new Vector2(trans_2.position.x , trans_2.position.y );// (6,0,0)

			ray = new Ray2D(pos_1 , pos_2 - pos_1);//起点就是pos_1的位置,方向指向pos_2

			raycast = Physics2D.Raycast(ray.origin , ray.direction , distance);

			Debug.Log(ray);

			Debug.Log("Fraction is " + raycast.fraction);

			Debug.Log("Distance is " + raycast.distance);
		}

	}
}

结果如下:

  1. 当distance设置为1时:
    【unity2D】API-学习记录10-射线投射碰撞信息类RaycastHit2D

  2. 当distance设置为10时:
    【unity2D】API-学习记录10-射线投射碰撞信息类RaycastHit2D

  3. 当distance设置为20时:
    【unity2D】API-学习记录10-射线投射碰撞信息类RaycastHit2D

  4. 当distance设置为10,但2的位置为(6,6,0)时:
    【unity2D】API-学习记录10-射线投射碰撞信息类RaycastHit2D

得出结论:

fraction和Physics2D.Raycast中的distance的值有关,具体关系为

fraction = Physics2D.Raycast-distance / RaycastHit2D-distance

发现了另一些端倪:

第二组和第四组数据中的Ray2D-Dir。其规律应该为“Dir-x和Dir-y的平方和为1”,只不过Debug输出它时保留一位小数,所以看起来没那么直观。经过一些测试后,大致符合平方和为一的规律。(这个好像没啥用)

总结

API中“fraction表示为矢量大小的“分数”(可以大于 1)”,意为

fraction = Physics2D.Raycast-distance / RaycastHit2D-distance

参考资料

Unity API RaycastHit2D(EN)
Unity API RaycastHit2D(CN)

上一篇:05-Hive内部表和外部表


下一篇:OSPF多区域中必须有area0。非area0区域要与area0相连才能实现传播域间路由信息