Unity如何检测特定的游戏对象是否在您附近

时间:2018-06-29 18:20:48

标签: c# unity3d

我正在创建一个测试游戏,因为我已经准备好创建自己的第一款游戏,但是我想确保自己掌握了第一款游戏所需的所有简单技巧。如果物品与您之间有一定距离,则其中一种机制就是拾取物品。有时游戏中可能有多个相同的对象,我认为代码对所有硬币都适用,但事实并非如此。 Debug.Log()仅适用于一种特定的硬币,我如何制作它,以便无论我在附近的哪枚硬币都将触发它? 代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerController : MonoBehaviour {
    //Player Variables
    public float moveSpeed;
    public float jumpHeight;
    public float raycastDistanceGround;
    public Text moneyText;


    private bool isGrounded;
    private Rigidbody _rgb;
    private GameObject player;
    private GameObject[] coin;
    private float distanceToCollectCoin;
    private float distanceToCoin;




    void Start () {
        moveSpeed = 7f;
        jumpHeight = 9f;
        raycastDistanceGround = 0.5f;


        isGrounded = true;
        _rgb = GetComponent<Rigidbody>();
        player = GameObject.FindGameObjectWithTag("Player");
        coin = GameObject.FindGameObjectsWithTag("Coin");
        distanceToCollectCoin = 2f;

        Cursor.lockState = CursorLockMode.Locked;
    }

    void FixedUpdate () {
        IsGrounding();
        Move();
        Jump();
        SetMoneyText();
        NearCoin();

    }

    //Player Moving Mechanics
    void Move() {
        var moveHorizontal = Input.GetAxis("Horizontal") * moveSpeed * Time.fixedDeltaTime;
        var moveVertical = Input.GetAxis("Vertical") * moveSpeed * Time.fixedDeltaTime;

        transform.Translate(moveHorizontal, 0f, moveVertical);

        if (Input.GetKeyDown(KeyCode.Escape)) {
            Cursor.lockState = CursorLockMode.None;
        }
    }

    //Player Jump Mechanics
    void Jump() {
        var jump = new Vector3(0f, _rgb.position.y, 0f);

        if (Input.GetKey(KeyCode.Space) && isGrounded == true) {
            for (float i = 0; i <= jumpHeight; i++) {
                jump.y += i;
                _rgb.AddForce(jump);
            }
        }
    }

    void IsGrounding() {
        if (Physics.Raycast(transform.position, Vector3.down, raycastDistanceGround)) {
            isGrounded = true;
        } else {
            isGrounded = false;
        }
    }

    void SetMoneyText() {
        moneyText.text = ("Money: " + EconomyController.Money);
    }

    void NearCoin() {
        for (int i = 0; i < coin.Length; i++) {
            distanceToCoin = Vector3.Distance(coin[i].transform.position, player.transform.position);

        }

        if (distanceToCoin < distanceToCollectCoin) {
            Debug.Log("Near Coin");
        }
    }
}

1 个答案:

答案 0 :(得分:1)

看起来您刚刚将一些错误括起来。您需要将if语句移入for循环。现在,它仅检查数组中最后一个硬币的距离。

void NearCoin() 
{
    for (int i = 0; i < coin.Length; i++) 
    {
        distanceToCoin = Vector3.Distance(coin[i].transform.position, player.transform.position);

        if (distanceToCoin < distanceToCollectCoin) 
            Debug.Log("Near Coin");
    }
}