Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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,我的角色控制器的接地状态在每一帧都会持续闪烁。据我所知,它应该通过player.isground检查玩家是否被禁飞,但其他东西正在将其移向上 using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerCharacterController: MonoBehaviour { static Animator anim; public bool

我的角色控制器的接地状态在每一帧都会持续闪烁。据我所知,它应该通过player.isground检查玩家是否被禁飞,但其他东西正在将其移向上

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

public class PlayerCharacterController: MonoBehaviour {

    static Animator anim;

    public bool walking;

    public GameObject playerModel, Hero;
    //Transforms
    public Transform playerCam, character, centerPoint;

    private Vector3 moveDirection;

    //character controller declaration
    CharacterController player;

    //Mouse Rotation
    private float rotX, rotY;
    //Mouse Y Position
    public float mouseYPosition = 1f; 
    //Mouse Sensitivity
    public float Sensitivity = 10f;
    //Mouse Zoom
    private float zoom;
    public float zoomSpeed = 2;
    //Clamping Zoom
    public float zoomMin = -2f;
    public float zoomMax = -10f;
    public float rotationSpeed = 5f;
    //Move Front Back left & Right
    private float moveFB, moveLR;   
    //Movement Speed
    public float Speed = 2f;
    //Velocity of Gravity
    public float verticalVelocity;
    //Jump Distance
    public float jumpDist = 5f;
    //Multiple Jumps
    int jumpTimes;
    //To use with Dialogue Manager
    public DialogueManager DiagM;

    public AudioClip jumpSound;
    public AudioClip HurtSound;
    public AudioClip PunchSound;

    AudioSource audioSource;

    //knockback

    public float knockBackForce;
    public float knockBackTime;
    private float knockBackCounter;


    // Use this for initialization
    void Start ()   
    {
        //character controller
        player = GameObject.Find("Player").GetComponent<CharacterController> ();

        StartCoroutine(MyCoroutine(character));

        anim = GetComponent<Animator>();

        //mouse zoom
        zoom = -3;  
        centerPoint.transform.position = playerCam.transform.position;
        centerPoint.transform.parent = null;
        audioSource = GetComponent<AudioSource>();
    }

    IEnumerator MyCoroutine (Transform character)
    {
        if (player.isGrounded == true)

        {
        anim.SetBool("isFalling",false);
        //anim.SetBool("isIdling", true);
        yield return new WaitForSeconds(0);
        }

    }
    // Update is called once per frame

    void Update ()
    {        
        //Mouse Zoom Input
        zoom += Input.GetAxis ("Mouse ScrollWheel") * zoomSpeed;

        if (zoom > zoomMin)
            zoom = zoomMin;
        if (zoom < zoomMax)
            zoom = zoomMax;

        //Mouse Camera Input
        playerCam.transform.localPosition = new Vector3 (0, 0, zoom);

        //Mouse Rotation

        rotX += Input.GetAxis ("Mouse X") * Sensitivity;
        rotY -= Input.GetAxis ("Mouse Y") * Sensitivity;      

        //Clamp Camera
        rotY = Mathf.Clamp (rotY, -60f, 60f);
        playerCam.LookAt (centerPoint);
        centerPoint.localRotation = Quaternion.Euler (rotY, rotX, 0);

        //Movement Speed
        if (knockBackCounter <= 0)
        {   
            moveDirection = (transform.forward * Input.GetAxis("Vertical")) + (transform.right * Input.GetAxis("Horizontal"));
            moveDirection = moveDirection * Speed;
            moveDirection.y = verticalVelocity;

            player.Move(moveDirection * Time.deltaTime);



            //Movement Rotation

            centerPoint.position = new Vector3 (character.position.x, character.position.y + mouseYPosition, character.position.z);

            //knockback disable
            //Movement Input

            if (Input.GetAxis("Vertical") != 0 || Input.GetAxis("Horizontal") != 0)

            {
                transform.rotation = Quaternion.Euler(0f, centerPoint.rotation.eulerAngles.y, 0f);
                Quaternion turnAngle = Quaternion.LookRotation(new Vector3(moveDirection.x, 0f, moveDirection.z));
                playerModel.transform.rotation = Quaternion.Slerp(playerModel.transform.rotation, turnAngle, Time.deltaTime * rotationSpeed);

                if (player.isGrounded == true)
                {
                    anim.SetBool("isWalking", true);
                    anim.Play("Running");
                }
            }
            else 
            {
                StartCoroutine(MyCoroutine(character));
            }

            if (Input.GetButtonDown("LHand"))
            {
                audioSource.PlayOneShot(PunchSound, 1F);
                anim.Play("RPunch");
            }

            if (player.isGrounded == true)
            {
                jumpTimes = 0;
                //verticalVelocity = -Physics.gravity.y * Time.deltaTime;
                verticalVelocity = 0;
            }
            else
            {
                verticalVelocity += Physics.gravity.y * Time.deltaTime;
                anim.SetBool("isWalking", false);
                anim.SetBool("isFalling", true);
            }


            if (jumpTimes < 1)
            {
                if (Input.GetButtonDown("Jump"))
                {
                    verticalVelocity += jumpDist;
                    anim.Play("Jump");
                    audioSource.PlayOneShot(jumpSound, 1F);
                    jumpTimes += 1;
                }
            }
        }
        else
        {
            knockBackCounter -= Time.deltaTime;
        }
    }

    public void Knockback(Vector3 direction)
    {
        knockBackCounter = knockBackTime;
        anim.Play("Jump");
        audioSource.PlayOneShot(HurtSound, 50F);
        moveDirection = direction * knockBackForce;
        moveDirection.y = knockBackForce;
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类PlayerCharacterController:单行为{
静态动画;
公共厕所步行;
公共游戏对象玩家模型,英雄;
//转变
公共转换播放摄像头、角色、中心点;
专用矢量3移动方向;
//字符控制器声明
角色控制器;
//鼠标旋转
私人浮动rotX,rotY;
//鼠标Y位置
公共浮动鼠标位置=1f;
//小鼠敏感性
公共浮动灵敏度=10f;
//鼠标缩放
私有浮动变焦;
公共浮动缩放速度=2;
//夹紧变焦
公共浮动zoomMin=-2f;
公共浮动zoomMax=-10f;
公共浮子旋转速度=5f;
//前后左右移动
私有浮动移动fb、移动lr;
//移动速度
公共浮动速度=2f;
//重力速度
城市公共交通;
//跳跃距离
公共浮动跳线距离=5f;
//多次跳跃
整数跳变时间;
//与对话管理器一起使用
公共对话管理器DiagM;
公共音频剪辑;
公共音频剪辑;
公共音频剪辑PunchSound;
声源;声源;
//击退
公共权力;
公共浮动回退时间;
私人浮动击退计数器;
//用于初始化
无效开始()
{
//字符控制器
player=GameObject.Find(“player”).GetComponent();
start例程(MyCoroutine(character));
anim=GetComponent();
//鼠标缩放
缩放=-3;
centerPoint.transform.position=playerCam.transform.position;
centerPoint.transform.parent=null;
audioSource=GetComponent();
}
IEnumerator例程(转换字符)
{
如果(player.isground==true)
{
动画设置工具(“正在下降”,错误);
//动画设置工具(“Isiling”,真);
返回新的WaitForSeconds(0);
}
}
//每帧调用一次更新
无效更新()
{        
//鼠标缩放输入
zoom+=Input.GetAxis(“鼠标滚轮”)*缩放速度;
如果(缩放>缩放)
zoom=zoomMin;
如果(缩放<缩放最大值)
缩放=缩放最大值;
//鼠标摄像机输入
playerCam.transform.localPosition=新矢量3(0,0,缩放);
//鼠标旋转
rotX+=Input.GetAxis(“鼠标X”)*灵敏度;
rotY-=Input.GetAxis(“鼠标Y”)*灵敏度;
//夹式摄像机
rotY=金属夹(rotY,-60f,60f);
playerCam.LookAt(中心点);
centerPoint.localRotation=Quaternion.Euler(rotY,rotX,0);
//移动速度

if(knockBackCounter根据您的评论。您不应该通过检查动画参数来确定您的播放机是否停止播放。最好的方法是使用RayCast()。因此,您必须执行以下操作:

  • 创建一个名为
    Ground
    的层,并将所有平台添加到 将场景添加到该层
  • 创建一个bool变量
  • i、 e

  • 创建一个函数来检查角色是否固定
  • 比如:

    bool checkGrounded(){
    
        return Physics.Raycast(transform.position, Vector3.down, 2f, 1 << LayerMask.NameToLayer("Ground")));
    
    } 
    
    void Update(){
        isGrounded = checkGrounded();
    }
    

    根据您的评论。您不应该通过检查动画参数来确定播放机是否固定。最好的方法是使用光线投射()。因此,您必须执行以下操作:

  • 创建一个名为
    Ground
    的层,并将所有平台添加到 将场景添加到该层
  • 创建一个bool变量
  • i、 e

  • 创建一个函数来检查角色是否固定
  • 比如:

    bool checkGrounded(){
    
        return Physics.Raycast(transform.position, Vector3.down, 2f, 1 << LayerMask.NameToLayer("Ground")));
    
    } 
    
    void Update(){
        isGrounded = checkGrounded();
    }
    

    可能已经解决了,但原因是,如果使用角色控制器,则应始终对角色应用重力

    当角色与某个对象碰撞时,它实际上会进入该对象内部一点,然后Unity将角色推回该对象,直到它不再接触该对象。此时,你的重力开始再次作用,并重新开始循环

    你需要在100%的时间内施加重力,以产生足够的力来“平衡”这场与地面的战斗。可以是更小的“重力”,如1。无需成为重力变量

    除此之外,我还想添加一个“郊狼时间”,并在isground()方法上创建一个,如下所示:

        public bool IsGrounded()
    {
        return CoyoteTime < CoyoteTimeMax;
    }
    
    public void CoyoteControl()
    {
        if (CharController.isGrounded)
        {
            CoyoteTime = 0;
        }
        else
        {
            CoyoteTime += Time.deltaTime;
        }
    }
    
    public bool IsGrounded()
    {
    返回郊狼时间<郊狼时间最大值;
    }
    公共空间郊狼控制()
    {
    如果(CharController.isground)
    {
    郊狼时间=0;
    }
    其他的
    {
    郊狼时间+=时间增量时间;
    }
    }
    
    然后我在Update()上调用CoyoteControl(),我可以随时调用isground()。
    在inspector上,我通常将CoyoteTimeMax设置为0.1,这样可以使摔倒更加平稳。

    可能已经解决了,但原因是如果使用角色控制器,则应始终对角色应用重力

    当角色与某个对象碰撞时,它实际上会进入该对象内部一点,然后Unity将角色推回该对象,直到它不再接触该对象。此时,你的重力开始再次作用,并重新开始循环

    你需要在100%的时间内施加重力,以产生足够的力来“平衡”这场与地面的战斗。可以是更小的“重力”,如1。无需成为重力变量

    除此之外,我还想添加一个“郊狼时间”,并在isground()方法上创建一个,如下所示:

        public bool IsGrounded()
    {
        return CoyoteTime < CoyoteTimeMax;
    }
    
    public void CoyoteControl()
    {
        if (CharController.isGrounded)
        {
            CoyoteTime = 0;
        }
        else
        {
            CoyoteTime += Time.deltaTime;
        }
    }
    
    public bool IsGrounded()
    {
    返回郊狼时间<郊狼时间最大值;
    }
    公共空间郊狼控制()
    {
    if(Char)