【问题标题】:Falling Respawn坠落重生
【发布时间】:2015-01-19 18:08:26
【问题描述】:

我正在使用 Unity 制作平台游戏,并使用 C# 进行编程。我有一个 Ball Control 脚本,它处理输入和其连续弹跳背后的物理特性。我还有一个 BounceTrigger 脚本,它可以让球停下来,然后让它再次反弹。我试图用玩家实现重生应该是在他反弹过来的最后一个不可破坏的平台上重生。

控球脚本 公共浮动速度 = 2;

bool alreadyBounced;
bool boost;
float boostMultiplier;
Vector3 boostVelocityAdd;

int fallY = 10;
BounceTrigger platform;

// Update is called once per frame
void Update () 
{
    alreadyBounced = false;

    float appliedVelocity = velocity * (boost ? boostMultiplier : 1);
    Vector3 direction = Vector3.zero;

    if(Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A)) { direction = Vector3.left; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange);}
    if(Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D)) { direction = Vector3.right; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange);}
    if(Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.W)) { direction = Vector3.forward; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange);}
    if(Input.GetKeyDown(KeyCode.DownArrow) || Input.GetKeyDown(KeyCode.S)) { direction = -Vector3.forward; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange); }

    if(Input.GetKeyUp(KeyCode.LeftArrow) || Input.GetKeyUp(KeyCode.A)) { direction = -Vector3.left; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange); }
    if(Input.GetKeyUp(KeyCode.RightArrow) || Input.GetKeyUp(KeyCode.D)){ direction = -Vector3.right; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange); }
    if(Input.GetKeyUp(KeyCode.UpArrow) || Input.GetKeyUp(KeyCode.W)) { direction = -Vector3.forward; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange); }
    if(Input.GetKeyUp(KeyCode.DownArrow) || Input.GetKeyUp(KeyCode.S)) { direction = Vector3.forward; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange); }
    CheckFalling ();
}

public void CheckFalling(){
    if(this.transform.position.y < fallY){
        Respawn();
    }
}

public void Respawn(){
    this.transform.position = lastPlatform.transform.position + Vector3.up;
}



public void Bounce(BounceTrigger platform, float upVelocity) {

    var reboteGO = (GameObject) GameObject.FindWithTag ("TextoRebote");
    var reboteComp = reboteGO.GetComponent<BounceCounter>();

    if(!alreadyBounced)
    {
        if(!platform.isDestructible){
            lastPlatform = platform;
        }

        Debug.Log("Bounce");
        alreadyBounced = true;
        reboteComp.AumentarRebote();
        float downVelocity = rigidbody.velocity.y;
        rigidbody.AddForce(Vector3.up * (-downVelocity + upVelocity), ForceMode.VelocityChange);
        ResetBoost();
    }
}

public void Boost(float multiplier){
    if(!boost){
        Debug.Log("Boost");
        StartCoroutine(BoostCoroutine(multiplier));
    }
}

public void ResetBoost(){
    if(boost){
        Debug.Log("Reset boost");
        boost = false;
        Vector3 velocityAdd = rigidbody.velocity;
        velocityAdd.x = velocityAdd.x / boostMultiplier * (boostMultiplier - 1);
        velocityAdd.z = velocityAdd.z / boostMultiplier * (boostMultiplier - 1);
        velocityAdd.y = 0;
        rigidbody.AddForce(-velocityAdd, ForceMode.VelocityChange);
    }
}

public void RestarVida(){
    var vidaGO = (GameObject) GameObject.FindWithTag ("TextoVida");
    var vidaComp = vidaGO.GetComponent<LifeCounter>();
    vidaComp.RestarVida ();
}

IEnumerator BoostCoroutine(float multiplier){
    yield return 0;
    yield return new WaitForFixedUpdate();
    boost = true;
    boostMultiplier = multiplier;
    Vector3 velocityAdd = rigidbody.velocity;
    Debug.Log(velocityAdd);
    velocityAdd.x = velocityAdd.x * (boostMultiplier - 1);
    velocityAdd.z = velocityAdd.z * (boostMultiplier - 1);
    velocityAdd.y = 0;
    rigidbody.AddForce(velocityAdd, ForceMode.VelocityChange);
    Debug.Log(velocityAdd);
}

弹跳触发脚本: ` 公共浮动 upVelocity = 10;

public bool isDestructible = false;

public virtual void OnTriggerEnter(Collider collider){
    collider.GetComponent<BallControl>().Bounce(this, upVelocity);
}

当我编译这个时,我得到一个 nullReferenceException `

【问题讨论】:

  • 当您因错误而寻求帮助时,您应该发布整个错误,因为有时输出会显示发生错误的代码行。
  • IAssets/GameAssets/Scripts/BallControl.cs(56,33):错误 CS0103:当前上下文中不存在名称“lastPlatform”||对不起,这是新的:S
  • 你在哪里声明lastPlatform
  • 好的,我想我明白了。检查答案。

标签: c# windows unity3d game-physics


【解决方案1】:

您有一个全局变量 BounceTrigger platform; 而不是 BounceTrigger lastPlatform;,因此 lastPlatform 在您的代码中的任何位置都不存在。

【讨论】:

  • 哦,感谢您的快速答复。现在我得到了 NullReferenceException:“NullReferenceException:对象引用未设置为对象的实例 BallControl.Respawn ()(在 Assets/GameAssets/Scripts/BallControl.cs:44)BallControl.CheckFalling ()(在 Assets/GameAssets/Scripts /BallControl.cs:39) BallControl.Update () (在 Assets/GameAssets/Scripts/BallControl.cs:34)"
  • 试试this.Respawn()。所有功能都一​​样。使用this. 给他们打电话。顺便说一句,我不是 c# 用户,所以我不知道到底发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多