我正在使用光线投射控制器创建一个平台系统,该控制器使用界面根据我的播放器当前碰撞的平台类型执行不同的任务。一些平台类型包括冰块,可通行的块和泥泞的地面。
我想知道如何更好地优化我的代码,因为我目前每帧都调用Unity有点昂贵的“GetComponent()”函数,即使我从不在块之间进行更改。我想做的只是当我从一种类型的平台转换到另一种类型的平台(即泥泞的地面 - > ice)时调用GetComponent(),但不知道如何使用接口执行此操作。
我以为我可以使用枚举来比较类型,但是不允许在界面中声明类型。
if (hit)
{
//I'd only like to run this block of code if the type of platform changes
var platform = hit.collider.gameObject.GetComponent<IPlatform>();
State.IsCollidingWithPassablePlatform = platform.IsPassable;
State.IsJumpBoosted = platform.IsJumpForce;
State.IsBoosted = platform.IsForce;
xForce = platform.XForce;
yForce = platform.YForce;
zForce = platform.ZForce;
defaultParameters.accelerationTimeGrounded = platform.AccelerationTimeGrounded;
defaultParameters.accelerationTimeAirborne = platform.AccelerationTimeAirborne;
接口示例:
interface IPlatform {
float AccelerationTimeGrounded { get; }
float AccelerationTimeAirborne { get; }
float XForce { get; }
float YForce { get; }
float ZForce { get; }
bool IsPassable { get; }
bool IsForce { get; }
bool IsJumpForce { get; }
Ice platform:
public class PlatformIce : MonoBehaviour, IPlatform {
public float AccelerationTimeGrounded { get { return accelerationTimeGrounded; } }
public float AccelerationTimeAirborne { get { return accelerationTimeAirborne; } }
public float XForce { get { return xForce; } }
public float YForce { get { return yForce; } }
public float ZForce { get { return zForce; } }
public virtual bool IsPassable { get { return false; } }
public bool IsForce { get { return false; } }
public bool IsJumpForce { get { return false; } }
[SerializeField]
private float accelerationTimeGrounded = 1.0f;
[SerializeField]
private float accelerationTimeAirborne = 3.0f;
private float xForce = 0;
private float yForce = 0;
private float zForce = 0;
}
答案 0 :(得分:2)
记住你的最后一个GameObject并检查这个是否已经改变
private lastGameObj;
[...]
if(lastGameObj!= hit.collider.gameObject) {
var platform = hit.collider.gameObject.GetComponent<IPlatform>();
// [...] your magic here
lastGameObj= hit.collider.gameObject;
}
你会得到一个额外的条件,但你不会运行你的代码60次/秒,包括GetComponent();.
答案 1 :(得分:1)
您可以在界面中使用if(time < currentTimeMillis) {
//Do something
} else {
//Do something else
}
,只需在界面外声明enum
类型。
即:
enum
这显然会破坏封装,但是如果你真的想在界面中使用public enum PlatformType {Normal, Ice, Fire, etc}; //Use public only if needed, of course
interface IPlatform {
PlatformType platformType { get; }
//Your other stuff here
}
,那就没办法了。