Проблема возникает, потому что ваш Player перекрывается в начале raycast. Есть несколько способов исправить это:
1.Disable Queries запускаются в коллайдерах.
Перейдите в Edit-> Project Settings-> Physics 2D, затем убедитесь, что Queries Start In Colliders НЕ проверено. После изменения кода ваш код преуспел. Вот скриншот:
2. Другим решением является использование слоев. Ретрансляция, но игнорирование уровня Player
. Прежде чем вы это сделаете, сделайте обязательно создайте слой с именем Ground
и поместите свой объект GameObject на слой Ground
, затем создайте еще один слой с именем Player и поместите ваш плеер в слой Player
. Теперь мы можем использовать bitwise
для исключения слоя Player
из raycast.
Теперь давайте предположим, что номер слоя игрока 9
. Код ниже должен исправить вашу проблему.
public int playerLayer = 9;
int layerMask = ~(1 << playerLayer); //Exclude layer 9
RaycastHit2D hit = Physics2D.Raycast(rayOrigin, Vector2.down, 0.1f, layerMask);
Вот и все. Оба из них смогли решить вашу проблему.
Для других людей, читающих ниже, другие способы легко обнаружить, когда Player
касается пола без использования Physics2D.Raycast
или выполнения всех этих действий выше.
Просто присоедините к Player
.
public class Player : MonoBehaviour
{
public LayerMask groundLayer;
Collider2D playerCollider;
bool grounded;
void Start()
{
playerCollider = gameObject.GetComponent();
}
public bool IsGrounded()
{
grounded = Physics2D.OverlapCircle(playerCollider.transform.position, 1, groundLayer);
return grounded;
}
}
Или вы можете использовать IsTouchingLayers
.
public bool IsGrounded()
{
grounded = grounded = playerCollider.IsTouchingLayers(groundLayer.value);
return grounded;
}
Вы можете использовать свойство Prefix
для BindAttribute
, чтобы эффективно «разбить» префикс.
public JsonResult Validate([Bind(Prefix="HouseState.Name")]string Name)
, поэтому name="HouseState.Name"
становится только Name
при привязке