首頁>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);
        }
    }
}
最新回復
  • 6月前
    1 #

    有100万種方法可以完成,但這裏有一些簡便的方法:

    您可以使用線性限製轻松地將距离關节与unity的可配置關节相結合.確保使用如上所述的弹簧减震器,它將使您的角色轻轻觸碰邊界的邊缘。

    代替約束,您可以簡單地附加4个物件,不使用渲染器,而仅使用盒碰撞器.使盒子非常高,然後將播放器放入盒子。超級簡單.当角色有車辆時,禁用物件。

    這个有點奇怪,但是您可以建立一个不帶渲染器的物件,並製作一个大的倒置框或球體碰撞器.从理論上讲,這將阻止您的角色外出。

  • rendering:如何參考两種型別的載入螢幕?
  • unity:為什麼不重置setcolor和color