首页>Game>source

这是我的逻辑:

玩家移动时,我正在与另一个物体保持距离。

例如,当玩家处于远处时,例如61放慢了玩家"向前"移动的速度,直到玩家停止并且无法进一步向前移动为止。

无论玩家从哪里移动到物体移动到距离为61的起始位置,无论玩家移动到物体的哪个方向,都应采用相同的逻辑,无论玩家从物体的正面或侧面旋转360度

下一个逻辑/规则是我最大的问题之一:

当玩家由我旋转并朝着另一个方向旋转时,请让玩家选择再次移动,这使玩家开始从减速状态恢复到正常的步行速度.但前提是玩家面对另一个方向。

现在我面临的问题:

当播放器向前移动到距离61时,然后开始减速然后停止,如果播放器朝着另一个方向旋转并开始向后移动一毫秒,那么如果我再次将播放器向向前旋转,他会 可以再次移动并经过距离61。这样,即使玩家已经停止,我也可以通过面向玩家旋转来作弊,反方向仅移动一点,然后再次旋转并移动更多.我需要一些方法来确保,如果玩家停下来然后旋转另一个方向,则只有当他到达50或40的距离时才可以再次开始行走,然后他才能向后旋转并再次向前移动并放慢速度并停在距离61处。

第二个问题是,当我远离物体但位于侧面或背面的另一个位置时,播放器会自动行走/奔跑,并且一切都变得混乱.播放不停不慢。

我可以录制一个非常短且很小的视频片段,以说明我的意思,到目前为止,这是什么意思,如果该视频片段可能会更有助于理解我想做的事情,会出现什么问题。

这是我录制的简短视频片段,显示问题。

我从第37秒开始就射击了问题:在这种情况下,距离玩家后面的大型太空飞船的距离得到了检查。

https://www.youtube.com/watch?v=Rrw_swX5Q8A&feature=emb_logo

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityStandardAssets.Characters.ThirdPerson;
public class DistanceCheck : MonoBehaviour
{
    public GameObject distanceTarget;
    public GameObject longDistanceDescriptionTextImage;
    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;
            longDistanceDescriptionTextImage.SetActive(true);
            text.text = "I can't move that far by foot. I need to find some transportation to move any further.";
        }
        // Get the angle:
        if (angle > 180f && distance > 61f)
        {
            text.text = "";
            longDistanceDescriptionTextImage.SetActive(false);
            if (timeElapsedOpposite < lerpDurationOpposite)
            {
                valueToLerpOpposite = Mathf.Lerp(startValueForOpposite, endValueForOpposite, timeElapsedOpposite / lerpDurationOpposite);
                anim.SetFloat("Forward", valueToLerpOpposite);
                timeElapsedOpposite += Time.deltaTime;
            }
            anim.SetFloat("Forward", valueToLerpOpposite);
            timeElapsed = 0;
        }
        if (distance > 61f && Mathf.Abs(anim.GetFloat("Forward")) < 0.003943384f)
        {
            anim.SetBool("Idle", true);
        }
        else
        {
            anim.SetBool("Idle", false);
        }
    }
}
最新回答
  • 2021-1-3
    1 #

    有100万种方法可以完成,但这里有一些简便的方法:

    您可以使用线性限制轻松地将距离关节与unity的可配置关节相结合.确保使用如上所述的弹簧减震器,它将使您的角色轻轻触碰边界的边缘。

    代替约束,您可以简单地附加4个对象,不使用渲染器,而仅使用盒碰撞器.使盒子非常高,然后将播放器放入盒子。超级简单.当角色有车辆时,禁用对象。

    这个有点奇怪,但是您可以创建一个不带渲染器的对象,并制作一个大的倒置框或球体碰撞器.从理论上讲,这将阻止您的角色外出。

  • rendering:如何参考两种类型的加载屏幕?
  • unity:为什么不重置setcolor和color