首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >统一3D中字符隐藏不工作的碰撞检测

统一3D中字符隐藏不工作的碰撞检测
EN

Stack Overflow用户
提问于 2022-06-14 05:46:17
回答 1查看 58关注 0票数 0

我当时正在学习一个教程,但是CheckCollisionOverlap()函数出现了问题。这意味着在玩家蹲着的时候,检查球员头部是否有碰撞,但出于某种原因,他不会站起来(或停止原地行走)。

如果我评论PhysicsUpdate()CheckCollisionOverlap(),他会蹲下,蹲下,站起来,所以我知道这个问题必须存在于这个逻辑中。

在教程注释部分,有人提到他们更改了层掩码的值。我命名了一个分层掩码Player,并将其分配给第8层,但这仍然没有起到任何作用。

教程链接https://www.youtube.com/watch?v=QVxvwRAYeHU

代码语言:javascript
复制
    using UnityEngine;
 
    public class CrouchingState : State
    {
       float playerSpeed;
       bool belowCeiling;
       bool crouchHeld;
 
       bool grounded;
       float gravityValue;
       Vector3 currentVelocity;
 
 
       public CrouchingState(Character _character, StateMachine _stateMachine):base(_character, _stateMachine)
       {
           character = _character;
           stateMachine = _stateMachine;
       }
 
       public override void Enter()
       {
           base.Enter();
 
           character.animator.SetTrigger("crouch");  
           belowCeiling = false;
           crouchHeld = false;
           gravityVelocity.y = 0;
 
           playerSpeed = character.crouchSpeed;
           character.controller.height = character.crouchColliderHeight;
           character.controller.center = new Vector3(0f, character.crouchColliderHeight / 2f, 0f);
           grounded = character.controller.isGrounded;
           gravityValue = character.gravityValue;
 
        
       }
 
       public override void Exit()
       {
           base.Exit();
           character.controller.height = character.normalColliderHeight;
           character.controller.center = new Vector3(0f, character.normalColliderHeight / 2f, 0f);
           gravityVelocity.y = 0f;
           character.playerVelocity = new Vector3(input.x, 0, input.y);
           character.animator.SetTrigger("move");
       }
 
       public override void HandleInput()
       {
           base.HandleInput();
           if (crouchAction.triggered && !belowCeiling)
           {
               crouchHeld = true;
           }
           input = moveAction.ReadValue<Vector2>();
           velocity = new Vector3(input.x, 0, input.y);
 
           velocity = velocity.x * character.cameraTransform.right.normalized + velocity.z * character.cameraTransform.forward.normalized;
           velocity.y = 0f;
       }
 
       public override void LogicUpdate()
       {
           base.LogicUpdate();
           character.animator.SetFloat("speed", input.magnitude, character.speedDampTime, Time.deltaTime);
 
           if (crouchHeld)
           {
               stateMachine.ChangeState(character.standing);
           }
       }
 
       public override void PhysicsUpdate()
       {
           base.PhysicsUpdate();
           belowCeiling = CheckCollisionOverlap(character.transform.position + Vector3.up *    character.normalColliderHeight);
           gravityVelocity.y += gravityValue * Time.deltaTime;
           grounded = character.controller.isGrounded;
           if (grounded && gravityVelocity.y < 0)
           {
               gravityVelocity.y = 0f;
           }
           currentVelocity = Vector3.Lerp(currentVelocity, velocity, character.velocityDampTime);
 
           character.controller.Move(currentVelocity * Time.deltaTime * playerSpeed + gravityVelocity * Time.deltaTime);
 
           if (velocity.magnitude > 0)
           {
               character.transform.rotation = Quaternion.Slerp(character.transform.rotation, Quaternion.LookRotation(velocity), character.rotationDampTime);
           }
       }
 
       public bool CheckCollisionOverlap(Vector3 targetPositon)
       {
           int layerMask = 1 << 8;
           layerMask = ~layerMask;
           RaycastHit hit;
 
           Vector3 direction = targetPositon - character.transform.position;
           if (Physics.Raycast(character.transform.position, direction, out hit, character.normalColliderHeight, layerMask))
           {
               Debug.DrawRay(character.transform.position, direction * hit.distance, Color.yellow);
               return true;
           }
           else
           {
               Debug.DrawRay(character.transform.position, direction * character.normalColliderHeight, Color.white);
               return false;
           }       
       }
 
 
   }
EN

回答 1

Stack Overflow用户

发布于 2022-06-15 02:18:18

我还必须改变玩家游戏对象中所有层次的孩子。不太清楚为什么会起作用,但它的反应。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72612058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档