You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AI敌人抵达玩家目标时,如何通过Game Manager实现积分扣除?

Hey there! Let's work through fixing your score deduction issue with the AI Enemy system and Game Manager. Here's a step-by-step breakdown to get things working:

Fixing Score Deduction When AI Enemies Reach the Player

The core idea is: when an enemy detects it's reached the player, it needs to tell the Game Manager to subtract points. Let's walk through each piece that might be missing or misconfigured:

1. First, Confirm Collision/Trigger Detection Basics

For the enemy to "detect" it's reached the player, both objects need proper physics setup:

  • Both the enemy and player must have a Collider component (like BoxCollider or SphereCollider). If using trigger detection, check the Is Trigger box on one of them.
  • At least one of the objects needs a Rigidbody component (set to non-kinematic if you're moving the enemy via script).
  • Double-check the collision matrix (Edit → Project Settings → Physics) to ensure the enemy and player layers are allowed to interact.

2. Add a Public Score Deduction Method to Your Game Manager's Score Script

Assume your score-handling script is named ScoreManager and attached to your Game Manager object. You need a public method that other scripts (like the Enemy script) can call to subtract points:

public class ScoreManager : MonoBehaviour
{
    public int currentScore = 0;

    // Public method for enemies to call when they reach the player
    public void DeductScore(int amount)
    {
        // Prevent score from going negative
        currentScore = Mathf.Max(currentScore - amount, 0);
        Debug.Log($"Score deducted! Current score: {currentScore}");
        // Add your UI update logic here if needed
    }
}

3. Update the Enemy Script to Trigger Score Deduction

You need to detect when the enemy reaches the player, then call the Game Manager's deduction method. Here are two reliable ways to do this:

Option 1: Find the Game Manager Directly (Quick Test Setup)

In your Enemy script, add code to detect collisions/triggers and call the score method:

public class Enemy : MonoBehaviour
{
    private ScoreManager _scoreManager;

    void Start()
    {
        // Locate the Game Manager and its ScoreManager component
        _scoreManager = GameObject.Find("GameManager").GetComponent<ScoreManager>();
    }

    // Use this if you're using trigger colliders (Is Trigger checked)
    void OnTriggerEnter(Collider other)
    {
        // Verify the collided object is the player (match your player's tag)
        if (other.CompareTag("Player"))
        {
            _scoreManager.DeductScore(1);
            // Add enemy logic here (e.g., destroy, respawn)
            Destroy(gameObject);
        }
    }

    // Use this if you're using physical collisions (no Is Trigger)
    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Player"))
        {
            _scoreManager.DeductScore(1);
            Destroy(gameObject);
        }
    }
}

Option 2: Use a Singleton for the Score Manager (More Robust for Large Projects)

For a more stable setup (avoiding Find performance issues and missing object errors), turn your ScoreManager into a singleton:
Update the ScoreManager script:

public class ScoreManager : MonoBehaviour
{
    public static ScoreManager Instance; // Global singleton reference
    public int currentScore = 0;

    void Awake()
    {
        // Ensure only one instance exists across scenes
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject); // Keep Game Manager when switching scenes
        }
        else
        {
            Destroy(gameObject);
        }
    }

    public void DeductScore(int amount)
    {
        currentScore = Mathf.Max(currentScore - amount, 0);
        Debug.Log($"Score deducted! Current score: {currentScore}");
    }
}

Then simplify the Enemy script's trigger/collision logic:

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player"))
    {
        ScoreManager.Instance.DeductScore(1);
        Destroy(gameObject);
    }
}

4. Troubleshoot Common Issues

  • Double-check that your player object has the exact tag you're checking for (e.g., "Player" — case-sensitive!).
  • Ensure the Game Manager object is active in the scene, and the ScoreManager component isn't disabled.
  • Keep the Console window open during testing to catch errors like null references (these usually point to missing components or incorrect object names).

Follow these steps, and your enemies should successfully deduct points when they reach the player!

内容的提问来源于stack exchange,提问作者user9540087

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:42:11