【问题标题】:Raycasting Unity/ gravity ErrorRaycasting Unity/重力错误
【发布时间】:2018-07-07 09:31:51
【问题描述】:

我正在使用 Charactercontroller 组件来移动我的角色。 我想要实现的目标是让角色在我用鼠标点击时移动。为此,我在我点击的地方旋转,然后前进到光线与我的地形发生碰撞的点。 角色确实移动并到达我想要的位置。 问题是当走进坡道时,例如,角色一直在空中行走并且没有下降(据我所知,重力问题虽然当我测试将角色放在空中时编辑器确实下降)它在它应该去的时候停在上面并开始快速旋转。 这是我的动作脚本

 private float gravity = 1f;
Animator anim;
CharacterController charController;
private float mvtSpeed = 3f;
private float distanceToPoint;
Vector3 playerMvt;
bool canMove = false;
CollisionFlags collisionFlags;
Ray ray;
RaycastHit hit;
Vector3 PlayerTarget;
float height;

private void Awake()
{
    anim = GetComponent<Animator>();
    charController = GetComponent<CharacterController>();
}
void MoveThePlayer()
{
    if (Input.GetMouseButton(0))
    {
        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out hit)) {
            if (hit.collider is TerrainCollider)
            {
                if (Vector3.Distance(transform.position, hit.point) >= 0.5f)
                {
                    canMove = true;
                    anim.SetFloat("Walk", 1.0f);
                    PlayerTarget = hit.point;

                }
            }//terrain collider
        }//raycast
    }//mouse Down

    if (canMove)
    {
        Vector3 targetTemp = new Vector3(PlayerTarget.x, transform.position.y, PlayerTarget.z);
        transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(targetTemp - transform.position), 15.0f * Time.deltaTime);
        playerMvt = transform.forward * mvtSpeed * Time.deltaTime;
        if (Vector3.Distance(transform.position, PlayerTarget) <= 0.1f)
        {
            anim.SetFloat("Walk", 0f);
            playerMvt.Set(0f, 0f, 0f);
        }

    }//canMove

}
private void Update()
{
    MoveThePlayer();
    charController.Move(playerMvt);
    if (!charController.isGrounded)
    {
        playerMvt.y -= gravity * Time.deltaTime;
    }

}

【问题讨论】:

  • 放开鼠标会不会摔倒?

标签: c# unity3d


【解决方案1】:

一些事情。

canMove 永远不会重置为false,它可能应该在这里重置

 if (Vector3.Distance(transform.position, PlayerTarget) <= 0.1f)
 {
     anim.SetFloat("Walk", 0f);
     playerMvt.Set(0f, 0f, 0f);
 }

此代码对其当前所在的位置没有影响:

if (!charController.isGrounded)
{
    playerMvt.y -= gravity * Time.deltaTime;
}

你在移动播放器后将重力应用到playerMvt.y,下一帧你将在这里重新分配playerMvt

playerMvt = transform.forward * mvtSpeed * Time.deltaTime;

所以改成这个

private void Update()
{
    MoveThePlayer();
    if (!charController.isGrounded)
    {
        playerMvt.y -= gravity * Time.deltaTime;
    }
    charController.Move(playerMvt);
}

【讨论】:

  • 谢谢你,先生,解决了! ,非常感谢您的帮助! :D
  • @HaythemTarchouna 如果此答案解决了您的问题,请考虑将其标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多