I’m working on a udon can select player form far away, but Physics.Raycast can only get gameobject in scene. Any way to get the playerapi when raycast hit on player?
Heya,
Because of the very strict limitations on player data in Udon Sharp, as far as I know, there is no way to find players through collision detection outside of the built-in OnPlayerCollision methods. Although, I have found a really clunky solution to the problem by comparing the position of the hit point in the raycast with each player position. Something like this:
Vector3 position = new Vector3(0, 0, 0);
Vector3 direction = transform.forward;
float distance = 1;
VRCPlayerApi targetPlayer;
VRCPlayerApi[] players = new VRCPlayerApi[20];
RaycastHit hit;
if (Physics.Raycast(position, direction, out hit, distance))
{
foreach (VRCPlayerApi tPlayer in players) //loop through each player and determine if they meet similar position requirements
{
if (tPlayer == null)
continue;
Vector3 playerPos = tPlayer.GetPosition();
if (Vector3.Distance(new Vector3(hit.point.x, 0, hit.point.z), new Vector3(playerPos.x, 0, playerPos.z)) < 3f) //for the distance formula, id recommend checking it against a value calculated based on player size. I didnt write that portion cause I didnt need it for my use case.
{
targetPlayer = tPlayer;
return;
}
}
}
Of course, Id recommend editing the function to reduce a chance of incorrectly detecting a player when they were not hit.