记录个人学习unity中遇到的坑(一)——2D角色撞墙左右抽搐问题

   日期:2020-11-17     浏览:114    评论:0    
核心提示:出现该问题的代码如下:using System;using System.Collections;using System.Collections.Generic;using UnityEngine;public class PlayController : MonoBehaviour{ [Header("移动参数")] public Vector2 currentVelocity; public float xInput; public float LRMov

出现该问题的代码如下:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayController : MonoBehaviour
{ 
    [Header("移动参数")]
    public Vector2 currentVelocity;
    public float xInput;
    public float LRMoveForce;
   private void Start()
    { 
        pos = GetComponent<Transform>();
        rb = GetComponent<Rigidbody2D>();
    }
    private void Update()
    { 
        LRMovement();
    }

  private void LRMovement()
    { 
        if (rb.velocity.x < 0)
        { 
            faceDir = -1;
            pos.rotation = Quaternion.Euler(0, 180, 0);
            //transform.localScale = new Vector3(-1, 1, 1);

        }
        if (rb.velocity.x > 0)
        { 
            faceDir = 1;
            pos.rotation = Quaternion.Euler(0, 0, 0);
            //transform.localScale = new Vector3(1, 1, 1);
        }

        xInput = Input.GetAxisRaw("Horizontal");      
        rb.velocity = new Vector2(xInput * LRMoveForce, rb.velocity.y);
        currentVelocity = rb.velocity;
    }
}

该脚本挂载在player上,当player在水平方向上遇到static刚体的collider时持续按下移动键可能会发生角色左右抽搐的情况。同时观察到position.x会在极小范围内抖动,potion.y会以极小的速率递减。

无论是将物体左右翻转的方式改为修改loaclscale,还是将物体移动的方式由修改velocity改为addforce均无法解决问题。

可行的解决方案:判断物体朝向的代码不放在rb.velocity.x的判断下,修改后的代码如下

   private void LRMovement()
    { 
        if (rb.velocity.x < 0)
        { 
            faceDir = -1;
            //pos.rotation = Quaternion.Euler(0, 180, 0);
            //transform.localScale = new Vector3(-1, 1, 1);

        }
        if (rb.velocity.x > 0)
        { 
            faceDir = 1;
            //pos.rotation = Quaternion.Euler(0, 0, 0);
            //transform.localScale = new Vector3(1, 1, 1);
        }

        xInput = Input.GetAxisRaw("Horizontal");
        if (xInput < 0)
        { 
            pos.rotation = Quaternion.Euler(0, 180, 0);
        }
        if (xInput > 0)
        { 
            pos.rotation = Quaternion.Euler(0, 0, 0);
        }
        rb.velocity = new Vector2(xInput * LRMoveForce, rb.velocity.y);
        currentVelocity = rb.velocity;
    }

(第一次尝试制作游戏,不是很有经验,如果有更好的方法或者知道原因的也希望各位能在评论区指出。)

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服