【发布时间】:2018-09-30 13:19:22
【问题描述】:
首先,很抱歉标题中缺少信息。但我不能做得更好。 关键是我建立了一个抽象类来检查我的所有碰撞,里面有一个名为“isInteracting”的公共布尔值来检查我是否在对撞机内,如果我这样做,“isInteracting”为真,否则为假。所以,从这个父类继承的类可以使用“isInteracting”来知道我什么时候在对撞机里面做某事(例如显示消息、播放声音等),当我创建第二个继承自的类时父类我意识到我的布尔检查我是否在对撞机内没有正常工作,因为两个子类都调用它,我该如何解决?让他们独立。
简单示例:
public class Waitress : CollisionBehaviour
{
public override void SayHi()
{
if (isInteracting) Debug.Log("Hi");
else return;
}
public override void Update()
{
SayHi();
base.Update();
}
}
“SayHi()”是抽象类“CollisionBehaviour”的一个抽象方法,而“Update()”因为是虚拟的而被覆盖。
应@Poul Bak 的要求:
父类:
public abstract class CollisionBehaviour : MonoBehaviour
{
[HideInInspector] public bool isInteractingByButtonAction;
[HideInInspector] public bool isInteractingByTriggerCollision;
private bool buttonPressed, isInside, a, b;
private void CheckStay()
{
isInteractingByTriggerCollision = true;
// GameInputs.Interact is a mapped button from my controller
if (GameInputs.Interact && !buttonPressed)
{
buttonPressed = true;
isInteractingByButtonAction = true;
}
a = (!buttonPressed) ? true : false;
b = (!buttonPressed) ? true : false;
}
private void CheckExit()
{
isInside = false;
b = false;
isInteractingByButtonAction = false;
isInteractingByTriggerCollision = false;
if (buttonPressed) buttonPressed = false;
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player")) isInside = true;
}
private void OnTriggerExit(Collider other)
{
CheckExit();
}
private void Update()
{
if (isInside) CheckStay();
}
public virtual void LateUpdate()
{
if (a && b) { /* Will display a sprite to indicate which button should be pressed*/ }
}
}
儿童班:
public class InteractableObject : CollisionBehaviour
{
#region Exposed Variables
public AnimationCurve ease;
public float smoothTime;
public float minFov = 30;
public float maxFov = 50;
#endregion
private float currentVelocity;
private void InteractionFieldOfView()
{
// Animerp is an animation curve interpolation... Clever name I know
Camera.main.fieldOfView = isInteractingByTriggerCollision.Animerp(maxFov, minFov, ref currentVelocity, smoothTime, ease);
}
public override void LateUpdate()
{
InteractionFieldOfView();
base.LateUpdate();
}
}
好吧,正如我告诉你的那样,只有一个类从 CollisionBehaviour 继承时,相机视野 (isInteractingByTriggerCollision) 才能正常工作。 顺便说一句,我避免使用 OntriggerStay,因为垃圾收集器非常高
【问题讨论】:
-
请显示设置 isInteracting 和其他重要内容的代码。
-
@PoulBak 抱歉回复晚了,我很忙。