weixin_44609556 2024-09-13 18:01 采纳率: 0%
浏览 1

关于#unity#的问题:这个unity脚本挂角色上后动角色动不了(语言-c#)

这个unity脚本挂角色上后动角色动不了。跟着教程走的,不知道怎么回事

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

public enum PlayerState
{
    idle,
    run,
    die,
    attack,
    attack2
}

public class PlayerControl : MonoBehaviour
{
    //主角状态
    private PlayerState state = PlayerState.idle;
    //刚体组件
    private Rigidbody rBody;
    //动画器组件
    private Animator animator;
    //最大血量
    public int MaxHp = 100;
    //血量
    public int Hp = 100;
    // Start is called before the first frame update
    void Start()
    {
        //获取刚体组件
        rBody = GetComponent<Rigidbody>();
        //获取动画器组件
        animator = GetComponent<Animator>();
        //隐藏鼠标指针
        Cursor.lockState = CursorLockMode.Locked;
    }

    // Update is called once per frame
    void Update()
    {
        //按下Alt
        if (Input.GetKeyDown(KeyCode.LeftAlt))
        {
            //显示鼠标指针
            Cursor.lockState = Cursor.lockState == CursorLockMode.Locked ? CursorLockMode.None : CursorLockMode.Locked;
        }
        //如果鼠标指针为呼出状态不做任何事
        if(Cursor.lockState==CursorLockMode.None)
        {
            return;
        }
        //判断状态
        switch (state)
        {
            case PlayerState.idle:
                //允许旋转
                Rotate();
                //允许移动
                Move();
                //攻击
                Attack();
                //播放移动动画
                animator.SetBool("Run",true);
                break;
            case PlayerState.die:
                break;
            case PlayerState.attack:
                break;
            case PlayerState.attack2:
                break;
        }
    }
    //主角旋转控制
    void Rotate()
    {
        transform.rotation = Camera.main.transform.parent.rotation;
    }

    //主角移动控制
    void Move()
    {
        //获取水平轴
        float horizontal = Input.GetAxis("Horizontal");
        //获取垂直轴
        float vertical = Input.GetAxis("Vertical");
        //获取移动向量
        Vector3 dir = new Vector3(horizontal, 0, vertical);
        //如果按下了移动键
        if (dir != Vector3.zero)
        {
            //纵向移动
            rBody.velocity = transform.forward * vertical * 4;
            //横向移动
            rBody.velocity += transform.right * horizontal * 2;
            //切换移动状态
            state = PlayerState.idle;
        }
    }
    //攻击
    void Attack()
    {
        //单击鼠标左键攻击
        if (Input.GetMouseButtonDown(0))
        {
            //播放攻击动画
            animator.SetTrigger("Attack");
            //攻击状态
            state = PlayerState.attack;
        }
        //单击鼠标右键攻击
        if (Input.GetMouseButtonDown(1))
        {
            //播放攻击动画
            animator.SetTrigger("Attack2");
            //第二种攻击状态
            state = PlayerState.attack2;
        }
    }
    void AttackEnd()
    {
        //恢复为站立状态
        state = PlayerState.idle;
    }
    //受到攻击
    public void GetDamage(int damage)
    {
        //减小血量
        Hp -= damage;
        //如果血量为0
        if (Hp <= 0)
        {
            //变为死亡状态
            state = PlayerState.die;
            //播放一次死亡动画
            animator.SetTrigger("Die");
        }
    }
    //复活
    public void Revive(Vector3 position)
    {
        //如果是死亡状态
        if (state == PlayerState.die)
        {
            //复活
            animator.SetTrigger("Revive");
            //复活为站立状态
            state = PlayerState.idle;
            //复活位置
            transform.position = position;
        }
    }
    void Attack1_1()
    {

    }
    void Attack1_2()
    {

    }
    void Attack2_0()
    {

    }
    void Attack2_1()
    {

    }
    void Attack2_2()
    {

    }
}

  • 写回答

2条回答 默认 最新

  • 一轮明月照丘壑 2024-09-13 18:02
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    你的问题是在Unity中使用这个脚本后角色无法移动。从代码来看,问题可能出在Update函数中的Move方法里。你的角色移动逻辑只在检测到非零的输入轴时执行,这可能会导致在某些情况下角色无法正确移动。在Unity中,使用Input.GetAxis方法返回的是一个介于-1到1之间的值,当玩家释放按键时,这个值会平滑地过渡到0,而不是直接变成0。因此,即使玩家停止移动,dir可能仍然是一个非零向量,导致角色继续移动。

    为了解决这个问题,你可以添加一个判断条件来检查是否真正需要移动角色。在Update函数中修改Move方法的调用部分:

    void Update()
    {
        // ...(省略其他代码)
        switch (state)
        {
            case PlayerState.idle:
                // 判断是否真正需要移动角色
                if (Mathf.Abs(Input.GetAxis("Horizontal")) > float.Epsilon || Mathf.Abs(Input.GetAxis("Vertical")) > float.Epsilon) {
                    Rotate();
                    Move(); // 只有当输入轴非零时才调用Move方法
                }
                // ...(省略其他代码)
        }
    }
    

    这里使用了Mathf.Absfloat.Epsilon来检查输入轴的值是否足够大以至于足以引起角色移动。这样,只有当玩家真正移动控制杆时才会调用Move方法,避免角色在不操作的情况下仍然移动的问题。这样修改后应该可以解决你的问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月13日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?