Я хочу создать скоринговую систему (Unity 2D) - PullRequest
0 голосов
/ 04 декабря 2018

Я делаю 2D-игру, как Pac-Man.Тем не менее, у меня есть некоторые проблемы для создания системы начисления очков.

Я хочу обновлять счет всякий раз, когда мой Pacman ест монету (он же pacdot)

Я создал скрипт C # под названием 'ScoreManager'

Вот код

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

public class ScoreManager : MonoBehaviour {

    static int score = 0;

    public static void setScore(int value)
    {
        score += value;
    }

    public static int getScore()
    {
        return score;
    }

    void OnGUI ()
    {
        GUILayout.Label("Score: " + score.ToString());
    }
}

Этот код работает хорошо, когда я играю в свою игру на движке Unity

Но я не знаю, как настроить ScoreValue в сценариях Pacdot.

Вот код Pacdot

using UnityEngine;
using System.Collections;

public class Pacdot : MonoBehaviour {

    public int score = 10;

    void OnTriggerEnter2D(Collider2D co) {
        if (co.name == "pacman")
        {           
            Destroy(gameObject);
        }

    }
}

Также я добавил скрипт C # (Pacmanbehaviour)

using UnityEngine;
using System.Collections;

public class PacmanMove : MonoBehaviour {
    public float speed = 0.4f;
    Vector2 dest = Vector2.zero;

    void Start() {
        dest = transform.position;
    }

    void FixedUpdate() {
        // Move closer to Destination
        Vector2 p = Vector2.MoveTowards(transform.position, dest, speed);
        GetComponent<Rigidbody2D>().MovePosition(p);

        // Check for Input if not moving
        if ((Vector2)transform.position == dest) {
            if (Input.GetKey(KeyCode.UpArrow) && valid(Vector2.up))
                dest = (Vector2)transform.position + Vector2.up;
            if (Input.GetKey(KeyCode.RightArrow) && valid(Vector2.right))
                dest = (Vector2)transform.position + Vector2.right;
            if (Input.GetKey(KeyCode.DownArrow) && valid(-Vector2.up))
                dest = (Vector2)transform.position - Vector2.up;
            if (Input.GetKey(KeyCode.LeftArrow) && valid(-Vector2.right))
                dest = (Vector2)transform.position - Vector2.right;
        }

        // Animation Parameters
        Vector2 dir = dest - (Vector2)transform.position;
        GetComponent<Animator>().SetFloat("DirX", dir.x);
        GetComponent<Animator>().SetFloat("DirY", dir.y);
    }

    bool valid(Vector2 dir) {
        // Cast Line from 'next to Pac-Man' to 'Pac-Man'
        Vector2 pos = transform.position;
        RaycastHit2D hit = Physics2D.Linecast(pos + dir, pos);
        return (hit.collider == GetComponent<Collider2D>());
    }
}

1 Ответ

0 голосов
/ 04 декабря 2018

Скрипт ScoreManager должен жить как игровой объект или как компонент в игровом объекте.Затем вы можете добавить его в качестве поля в своем классе Pacdot.

Это будет примерно так ниже, но поиск конкретного игрового объекта, к которому прикреплен скрипт, будет зависеть от того, как вы его спроектировали ("метод поиска по тегу "не будет работать, если у вас нет игрового объекта с прикрепленным ScoreManager, с этим тегом).

using UnityEngine;
using System.Collections;

public class Pacdot : MonoBehaviour {

    public int score = 10;
    private ScoreManager _score = GameObject.findGameObjectWithTag("scoreKeeper").GetComponent<ScoreManager>();

    void OnTriggerEnter2D(Collider2D co) {
        if (co.name == "pacman")
        {           
            _score.SetScore(score);
            Destroy(gameObject);
        }

    }
}

Я бы также посмотрел на ответ @derHugo, связанный с - множество способов сделать это, в зависимости от ваших потребностей / дизайна.

...