該腳本附加到兩個游戲物件。
一個是碰撞區域,對撞機足夠大,所以當游戲開始時,玩家已經在對撞機區域內,然后當他退出該區域時,一切正常。
問題是當我將物件附加到另一個帶有對撞機的游戲物件上時,但這次對撞機較小,他在較大的對撞機內,所以現在玩家正在進入較小的對撞機,而不是第一次退出。但我希望在這兩種情況下都能產生相同的效果。
如果玩家退出對撞機,他會放慢速度等待然后轉身并向后移動。當玩家靠近火焰時,我想做同樣的事情,慢下來等待轉身,然后回到火焰中,玩家進入對撞機區域然后退出,而在更大的對撞機中,他首先退出然后進入。
兩個對撞機區域的螢屏截圖。左邊的那個是玩家先進入而不是退出的那個。當玩家在更大的對撞機區域時,游戲開始。

和腳本:
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UnityStandardAssets.Characters.ThirdPerson;
public class DistanceCheck : MonoBehaviour
{
public Transform targetToRotateTowards;
public Transform colliderArea;
public float lerpDuration;
public float rotationSpeed;
[TextArea(1, 2)]
public string textToShow;
public GameObject descriptionTextImage;
public TextMeshProUGUI text;
public ThirdPersonUserControl thirdPersonUserControl;
private Animator anim;
private float timeElapsed = 0;
private float startValue = 1;
private float endValue = 0;
private float valueToLerp = 0;
private bool startRotating = false;
private bool slowOnBack = true;
private bool exited = false;
private Vector3 exitPosition;
private float distance;
void Start()
{
anim = transform.GetComponent<Animator>();
}
private void FixedUpdate()
{
if (startRotating)
{
transform.rotation = Quaternion.RotateTowards(transform.rotation,
Quaternion.LookRotation(targetToRotateTowards.position - transform.position),
rotationSpeed * Time.deltaTime);
}
if (exitPosition != new Vector3(0, 0, 0) && slowOnBack)
{
distance = Vector3.Distance(transform.position, exitPosition);
}
if (distance > 5 && slowOnBack)
{
slowOnBack = false;
StartCoroutine(SlowDown());
}
}
private void OnTriggerExit(Collider other)
{
if (other.name == colliderArea.name)
{
exited = true;
slowOnBack = true;
exitPosition = transform.position;
thirdPersonUserControl.enabled = false;
descriptionTextImage.SetActive(true);
text.text = textToShow;
StartCoroutine(SlowDown());
}
}
private void OnTriggerEnter(Collider other)
{
if (other.name == colliderArea.name)
{
exited = false;
startRotating = false;
text.text = "";
descriptionTextImage.SetActive(false);
}
}
IEnumerator SlowDown()
{
timeElapsed = 0;
while (timeElapsed < lerpDuration)
{
valueToLerp = Mathf.Lerp(startValue, endValue, timeElapsed / lerpDuration);
anim.SetFloat("Forward", valueToLerp);
timeElapsed = Time.deltaTime;
yield return null;
}
if (exited)
{
yield return new WaitForSeconds(3f);
startRotating = true;
StartCoroutine(SpeedUp());
}
if (slowOnBack == false)
{
thirdPersonUserControl.enabled = true;
}
}
IEnumerator SpeedUp()
{
timeElapsed = 0;
while (timeElapsed < lerpDuration)
{
valueToLerp = Mathf.Lerp(endValue, startValue, timeElapsed / lerpDuration);
anim.SetFloat("Forward", valueToLerp);
timeElapsed = Time.deltaTime;
yield return null;
}
}
}
我現在面臨的兩個問題:
玩家進入它然后退出的對撞機越小,玩家退出它然后進入的對撞機越大,所以我需要以某種方式更改
OnTriggerExit/Enter腳本中的行為邏輯。但是如何制定邏輯?也許最好使腳本僅在播放器物件上并使其具有通用性,以便我可以將許多對撞機拖到它并在每個對撞機中產生效果問題是如何為每個對撞機制作一個文本欄位對撞機區域?現在因為我將腳本附加到每個對撞機物件我有一個
colliderArea變數但是如果我想讓腳本只附加到播放器我需要將colliderArea變數更改為 aList<Transform> collidersAreas然后如何為每個對撞機區域創建一個文本欄位/區域名單 ?
uj5u.com熱心網友回復:
我想我會通過創建兩個標簽NoExit和NoEntry. 創建標簽后,您可以在保存碰撞器的游戲物件上設定標簽。然后您可以檢查 and 中的標簽OnTriggerEnter并OnTriggerExit采取相應措施。
我無法確定您為哪種情況撰寫了哪些功能,或者兩者兼而有之 - 一切看起來都很混亂。最終,您應該使用類似 的功能RepositionPlayer,將他們移回他們違反禁止進入或禁止退出規則之前,然后某種OnPlayerRepositioned事件可以恢復他們的控制權。
我會留給你來分解你的功能,但總的來說,我會做如下的事情:
private void OnTriggerExit(Collider other)
{
if (other.tag == "NoExit")
{
RepositionPlayer();
}
else if(other.tag == "NoEntry")
{
OnPlayerRepositioned();
}
}
private void OnTriggerEnter(Collider other)
{
if (other.tag == "NoExit")
{
OnPlayerRepositioned();
}
else if(other.tag == "NoEntry")
{
RepositionPlayer();
}
}
再次在這里,我不清楚您要重新定位播放器要做什么,但看起來像這樣:
private void RepositionPlayer()
{
// Stuff that needs to happen to reposition the player
exited = true;
slowOnBack = true;
exitPosition = transform.position;
thirdPersonUserControl.enabled = false;
descriptionTextImage.SetActive(true);
text.text = textToShow;
StartCoroutine(SlowDown());
}
private void OnPlayerRepositioned()
{
// stuff you need to do to clear the "repositioning" status
exited = false;
startRotating = false;
text.text = "";
descriptionTextImage.SetActive(false);
}
像這樣拆分邏輯可以更容易閱讀和維護。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/488294.html
上一篇:從Physics.ComputePenetration()獲取碰撞點
下一篇:Unity:在網格上尋找最低頂點
