大家好!

我已经尝试了几个小时了,我是一个新手,所以我知道我一定是漏掉了什么。我有一个3D游戏,玩家是一个灰尘球,可以捡起灰尘块,这些灰尘块可以让玩家进行双跳,每次跳跃都会消耗一个灰尘块,所有这一切都在工作得很好,但我的问题是,我有一个脚本来收集灰尘,还有一个脚本来处理双跳/移动,我没有问题地在灰尘脚本中添加更多灰尘,但是否有办法从灰尘脚本的运动脚本中减少1个灰尘?

参考代码:

灰尘脚本

private void OnTriggerEnter(Collider collision)
{
    if (collision.CompareTag("Dust"))
    {
        AddDust(1);
        UpdateUI();
        audioSource.PlayOneShot(DustSound, DustVolume);
        Destroy(collision.gameObject);
    }

}

void AddDust(int amount)
{
    currentDust += amount;
    Debug.Log("Dust: " + currentDust);
    if (currentDust > maxDust)
    {
        currentDust = maxDust;
    }
    UpdateUI();
}

双跳脚本

void Start()
{
    currentDust = GetComponent<DustScript>().currentDust;
    rb = GetComponent<Rigidbody>();
    audioSource = GetComponent<AudioSource>();
    wasGrounded = IsGrounded();
}

if (Input.GetKeyDown(KeyCode.Space))
{
    if (timeSinceGrounded <= coyoteTime && !jumpLocked)
    {
        jumpLocked = true;
        lastGroundedTime = -100f;
        jumpHoldTimer = jumpHoldTime;
        rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        audioSource.PlayOneShot(jumpSound, jumpVolume);
    }

    else if (Dust > 0 && !jumpLocked)
    {
        rb.linearVelocity = Vector3.zero;
        jumpLocked = true;
        lastGroundedTime = -100f;
        jumpHoldTimer = jumpHoldTime;
        rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        audioSource.PlayOneShot(jumpSound, jumpVolume);
        SubtractDust(1);
    }
}
public void SubtractDust(int amount)
{
    Dust -= amount;
}

public bool IsGrounded()
{
    Vector3 center = transform.position + new Vector3(raycastCenterX, 0, 0);
    Vector3 left = transform.position + new Vector3(raycastLeftX, 0, 0);
    Vector3 right = transform.position + new Vector3(raycastRightX, 0, 0);

    return Physics.Raycast(center, Vector3.down, raycastDistance, groundLayer)
        || Physics.Raycast(left, Vector3.down, raycastDistance, groundLayer)
        || Physics.Raycast(right, Vector3.down, raycastDistance, groundLayer);
}

解决方案:

你可以在灰尘脚本中添加一个新的方法,例如SubtractDustFromMovementScript(int amount),这个方法可以接受一个灰尘数量参数,减少灰尘数量,并且在运动脚本中调用这个方法。

灰尘脚本

void SubtractDustFromMovementScript(int amount)
{
    Dust -= amount;
}

双跳脚本

else if (Dust > 0 && !jumpLocked)
{
    rb.linearVelocity = Vector3.zero;
    jumpLocked = true;
    lastGroundedTime = -100f;
    jumpHoldTimer = jumpHoldTime;
    rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
    audioSource.PlayOneShot(jumpSound, jumpVolume);
    GetComponent<DustScript>().SubtractDustFromMovementScript(1);
}

这样一来,灰尘脚本就可以从运动脚本中减少1个灰尘了。