C# 我怎样才能增加“返回”值;“前进”;如果播放器朝向另一个方向,动画状态将值缓慢浮回1?

C# 我怎样才能增加“返回”值;“前进”;如果播放器朝向另一个方向,动画状态将值缓慢浮回1?,c#,unity3d,C#,Unity3d,在播放器动画控制器而不是我的控制器中,有一个参数名Forward。 当我按W键向前移动播放器时,它将“向前”的值从0增加到1 min 0 max 1。从空闲状态向前为0到行走状态向前为1 在附加到播放器的脚本中,我做了这样的操作:当播放器达到一定距离时,播放器会慢慢平稳地从步行变为空闲,直到停止 问题是,现在“前进”值始终为0。我想让玩家向后移动和行走,只要他向前移动并达到一定距离,然后慢慢停下来,但如果我按下S向后移动,然后慢慢地将值增加到1 using System.Collections;

在播放器动画控制器而不是我的控制器中,有一个参数名Forward。 当我按W键向前移动播放器时,它将“向前”的值从0增加到1 min 0 max 1。从空闲状态向前为0到行走状态向前为1

在附加到播放器的脚本中,我做了这样的操作:当播放器达到一定距离时,播放器会慢慢平稳地从步行变为空闲,直到停止

问题是,现在“前进”值始终为0。我想让玩家向后移动和行走,只要他向前移动并达到一定距离,然后慢慢停下来,但如果我按下S向后移动,然后慢慢地将值增加到1

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityStandardAssets.Characters.ThirdPerson;

public class DistanceCheck : MonoBehaviour
{
    public GameObject distanceTarget;
    public GameObject descriptionTextImage;
    public TextMeshProUGUI text;

    private Animator anim;

    float timeElapsed;
    float lerpDuration = 3;

    float startValue = 1;
    float endValue = 0;
    float valueToLerp;

    // Start is called before the first frame update
    void Start()
    {
        anim = transform.GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        var distance = Vector3.Distance(transform.position, distanceTarget.transform.position);

        if (distance >= 61f)
        {
            if (timeElapsed < lerpDuration)
            {
                valueToLerp = Mathf.Lerp(startValue, endValue, timeElapsed / lerpDuration);
                anim.SetFloat("Forward", valueToLerp);
                timeElapsed += Time.deltaTime;
            }
            anim.SetFloat("Forward", valueToLerp);
            descriptionTextImage.SetActive(true);
            text.text = "I can't move that far by foot. I need to find some transportation to move any further.";
        }
        else
        {
            text.text = "";
            descriptionTextImage.SetActive(false);
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用TMPro;
使用UnityEngine;
使用UnityStandardAssets.Characters.ThirdPerson;
公共类距离检查:单行为
{
公共游戏对象距离目标;
公共游戏对象描述文本图像;
公共文本;
私人动画师;
浮动时间已过;
浮动时间=3;
浮动起始值=1;
浮点结束值=0;
浮动汇率;
//在第一帧更新之前调用Start
void Start()
{
anim=transform.GetComponent

现在我按下A键,或者因为我用鼠标更改了相机视图,所以我按下S键,但这并不重要,关键是当我将玩家转向另一个方向,然后朝向距离61时,玩家应该通过将“向前”值增加到1,再次开始缓慢行走

但是我怎么知道球员面对的是什么?我的意思是,如果他仍然面对61米的距离,或者他现在面对的是另一个方向

我现在尝试的是在else部分使用一个新的助手变量名newDir来检查玩家面对的方向,然后增加“Forward”值,但它不起任何作用:

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityStandardAssets.Characters.ThirdPerson;

public class DistanceCheck : MonoBehaviour
{
    public GameObject distanceTarget;
    public GameObject descriptionTextImage;
    public TextMeshProUGUI text;

    private Animator anim;

    float timeElapsed;
    float lerpDuration = 3;

    float startValue = 1;
    float endValue = 0;
    float valueToLerp;

    private Vector3 currentDir;
    private Vector3 newDir;

    // Start is called before the first frame update
    void Start()
    {
        anim = transform.GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        var distance = Vector3.Distance(transform.position, distanceTarget.transform.position);

        if (distance >= 61f)
        {
            if (timeElapsed < lerpDuration)
            {
                valueToLerp = Mathf.Lerp(startValue, endValue, timeElapsed / lerpDuration);
                anim.SetFloat("Forward", valueToLerp);
                timeElapsed += Time.deltaTime;
            }
            anim.SetFloat("Forward", valueToLerp);
            currentDir = transform.forward;
            descriptionTextImage.SetActive(true);
            text.text = "I can't move that far by foot. I need to find some transportation to move any further.";
        }
        else
        {
            if(newDir != currentDir)
            {
                startValue = 0;
                endValue = 1;
                if (timeElapsed < lerpDuration)
                {
                    valueToLerp = Mathf.Lerp(startValue, endValue, timeElapsed / lerpDuration);
                    anim.SetFloat("Forward", valueToLerp);
                    timeElapsed += Time.deltaTime;
                }
                anim.SetFloat("Forward", valueToLerp);
            }
            text.text = "";
            descriptionTextImage.SetActive(false);
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用TMPro;
使用UnityEngine;
使用UnityStandardAssets.Characters.ThirdPerson;
公共类距离检查:单行为
{
公共游戏对象距离目标;
公共游戏对象描述文本图像;
公共文本;
私人动画师;
浮动时间已过;
浮动时间=3;
浮动起始值=1;
浮点结束值=0;
浮动汇率;
私有向量3 currentDir;
私有向量3 newDir;
//在第一帧更新之前调用Start
void Start()
{
anim=transform.GetComponent();
}
//每帧调用一次更新
无效更新()
{
var distance=Vector3.距离(transform.position,distance target.transform.position);
如果(距离>=61f)
{
如果(经过的时间<更新时间)
{
valueToLerp=Mathf.Lerp(起始值、结束值、已用时间/lerpDuration);
动画设置浮动(“向前”,值为ERP);
timeappeased+=Time.deltaTime;
}
动画设置浮动(“向前”,值为ERP);
currentDir=transform.forward;
descriptionTextImage.SetActive(true);
text.text=“我走路走不了那么远。我需要找些交通工具再往前走。”;
}
其他的
{
if(newDir!=currentDir)
{
起始值=0;
endValue=1;
如果(经过的时间<更新时间)
{
valueToLerp=Mathf.Lerp(起始值、结束值、已用时间/lerpDuration);
动画设置浮动(“向前”,值为ERP);
timeappeased+=Time.deltaTime;
}
动画设置浮动(“向前”,值为ERP);
}
text.text=”“;
descriptionTextImage.SetActive(false);
}
}
}

也许不干净,这是最好的方法,但这正是我想要的

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityStandardAssets.Characters.ThirdPerson;

public class DistanceCheck : MonoBehaviour
{
    public GameObject distanceTarget;
    public GameObject descriptionTextImage;
    public TextMeshProUGUI text;

    private Animator anim;

    float timeElapsed = 0;
    float lerpDuration = 3;
    float startValue = 1;
    float endValue = 0;
    float valueToLerp = 0;

    // Opposite Direction
    float timeElapsedOpposite = 0;
    float lerpDurationOpposite = 3;
    float startValueForOpposite = 0;
    float endValueForOpposite = 1;
    float valueToLerpOpposite = 0;   

    float angle;

    // Start is called before the first frame update
    void Start()
    {
        angle = transform.eulerAngles.y;
        anim = transform.GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        var distance = Vector3.Distance(transform.position, distanceTarget.transform.position);
        angle = transform.eulerAngles.y;
        if (distance >= 61f && angle < 180)
        {
            if (timeElapsed < lerpDuration)
            {
                valueToLerp = Mathf.Lerp(startValue, endValue, timeElapsed / lerpDuration);
                anim.SetFloat("Forward", valueToLerp);
                timeElapsed += Time.deltaTime;
            }
            anim.SetFloat("Forward", valueToLerp);
            timeElapsedOpposite = 0;
            descriptionTextImage.SetActive(true);
            text.text = "I can't move that far by foot. I need to find some transportation to move any further.";
        }
        else
        {
            text.text = "";
            descriptionTextImage.SetActive(false);
        }

        // Get the angle:
        

        if (angle > 180f && distance >= 61f)
        {
            if (timeElapsedOpposite < lerpDurationOpposite)
            {
                valueToLerpOpposite = Mathf.Lerp(startValueForOpposite, endValueForOpposite, timeElapsedOpposite / lerpDurationOpposite);
                anim.SetFloat("Forward", valueToLerpOpposite);
                timeElapsedOpposite += Time.deltaTime;
            }
            anim.SetFloat("Forward", valueToLerpOpposite);

            timeElapsed = 0;
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用TMPro;
使用UnityEngine;
使用UnityStandardAssets.Characters.ThirdPerson;
公共类距离检查:单行为
{
公共游戏对象距离目标;
公共游戏对象描述文本图像;
公共文本;
私人动画师;
float timeappeased=0;
浮动时间=3;
浮动起始值=1;
浮点结束值=0;
浮点值TolERP=0;
//相反方向
float timelapsedopposite=0;
浮动时间对立面=3;
浮动起始值For反向=0;
相反方向的浮动端值=1;
浮点值TolerpAntivative=0;
浮动角;
//在第一帧更新之前调用Start
void Start()
{
角度=变换.eulerAngles.y;
anim=transform.GetComponent();
}
//每帧调用一次更新
无效更新()
{
var distance=Vector3.距离(transform.position,distance target.transform.position);
角度=变换.eulerAngles.y;
如果(距离>=61f和角度<180)
{
如果(经过的时间<更新时间)
{
valueToLerp=Mathf.Lerp(起始值、结束值、已用时间/lerpDuration);
动画设置浮动(“向前”,值为ERP);
timeappeased+=Time.deltaTime;
}
动画设置浮动(“向前”,值为ERP);
timeelapsedoposite=0;
descriptionTextImage.SetActive(true);
text.text=“我走路走不了那么远。我需要找些交通工具再往前走。”;
}
其他的
{
text.text=”“;
descriptionTextImage.SetActive(false);
}
//获取角度:
如果(角度>180华氏度和距离>等于61华氏度)
{
if(timeelapsedopositeusing System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityStandardAssets.Characters.ThirdPerson;

public class DistanceCheck : MonoBehaviour
{
    public GameObject distanceTarget;
    public GameObject descriptionTextImage;
    public TextMeshProUGUI text;

    private Animator anim;

    float timeElapsed = 0;
    float lerpDuration = 3;
    float startValue = 1;
    float endValue = 0;
    float valueToLerp = 0;

    // Opposite Direction
    float timeElapsedOpposite = 0;
    float lerpDurationOpposite = 3;
    float startValueForOpposite = 0;
    float endValueForOpposite = 1;
    float valueToLerpOpposite = 0;   

    float angle;

    // Start is called before the first frame update
    void Start()
    {
        angle = transform.eulerAngles.y;
        anim = transform.GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        var distance = Vector3.Distance(transform.position, distanceTarget.transform.position);
        angle = transform.eulerAngles.y;
        if (distance >= 61f && angle < 180)
        {
            if (timeElapsed < lerpDuration)
            {
                valueToLerp = Mathf.Lerp(startValue, endValue, timeElapsed / lerpDuration);
                anim.SetFloat("Forward", valueToLerp);
                timeElapsed += Time.deltaTime;
            }
            anim.SetFloat("Forward", valueToLerp);
            timeElapsedOpposite = 0;
            descriptionTextImage.SetActive(true);
            text.text = "I can't move that far by foot. I need to find some transportation to move any further.";
        }
        else
        {
            text.text = "";
            descriptionTextImage.SetActive(false);
        }

        // Get the angle:
        

        if (angle > 180f && distance >= 61f)
        {
            if (timeElapsedOpposite < lerpDurationOpposite)
            {
                valueToLerpOpposite = Mathf.Lerp(startValueForOpposite, endValueForOpposite, timeElapsedOpposite / lerpDurationOpposite);
                anim.SetFloat("Forward", valueToLerpOpposite);
                timeElapsedOpposite += Time.deltaTime;
            }
            anim.SetFloat("Forward", valueToLerpOpposite);

            timeElapsed = 0;
        }
    }
}