Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 光线投射单位/重力误差_C#_Unity3d - Fatal编程技术网

C# 光线投射单位/重力误差

C# 光线投射单位/重力误差,c#,unity3d,C#,Unity3d,我正在使用Charactercontroller组件移动角色。 我试图实现的目标是,当我用鼠标点击时,让角色离开。为此,我在单击的地方旋转,然后前进到光线碰撞器与我的地形相交的点。 角色确实移动并到达我想要的点。 问题是当走到坡道上时,例如,角色一直在空中行走而没有下降(据我所知,重力问题,尽管当我测试将角色放在空中时,编辑器确实下降了),它在应该下降时停止,并开始快速旋转。 这是我的动作脚本 private float gravity = 1f; Animator anim; Charact

我正在使用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;
    }

}
private float gravity=1f;
动画师;
字符控制器字符控制器;
私人浮动MVT速度=3f;
专用浮点数;
矢量3播放器;
bool canMove=false;
碰撞标志碰撞标志;
射线;
雷卡斯特击中;
矢量3播放器目标;
浮动高度;
私人空间
{
anim=GetComponent();
charController=GetComponent();
}
void MoveThePlayer()
{
if(输入。GetMouseButton(0))
{
ray=Camera.main.ScreenPointToRay(输入.鼠标位置);
如果(物理.光线投射(光线,出击)){
如果(命中对撞机是TerrainCollider)
{
if(矢量3.距离(变换位置、击中点)>=0.5f)
{
canMove=true;
动画设置浮动(“行走”,1.0f);
PlayerTarget=命中点;
}
}//地形对撞机
}//雷卡斯特
}//鼠标落下
如果(可以移动)
{
Vector3 targetTemp=新的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;
如果(向量3.距离(变换.位置,播放目标)一些事情

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

 if (Vector3.Distance(transform.position, PlayerTarget) <= 0.1f)
 {
     anim.SetFloat("Walk", 0f);
     playerMvt.Set(0f, 0f, 0f);
 }
移动播放机后,将重力应用于
playerMvt.y
,下一帧将在此处重新分配
playerMvt

playerMvt = transform.forward * mvtSpeed * Time.deltaTime;
所以把它改成这个

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

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

 if (Vector3.Distance(transform.position, PlayerTarget) <= 0.1f)
 {
     anim.SetFloat("Walk", 0f);
     playerMvt.Set(0f, 0f, 0f);
 }
移动播放机后,将重力应用于
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如果这个答案解决了你的问题,请考虑把它标记为接受。谢谢,先生,解决了!!,我非常感谢你的帮助!HaythemTarchouna,如果这个答案解决了你的问题,请考虑将它标记为接受。