我想创建评分系统(Unity 2D)
I want to create scoring system (Unity 2D)
我正在制作吃豆人之类的 2D 游戏。尽管如此,我在创建评分系统时遇到了一些问题。
我想在我的吃豆人吃硬币时更新分数(a.k.a pacdot)
我制作了名为 'ScoreManager'
的 C# 脚本
这是代码
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 引擎中玩我的游戏时,这段代码运行良好
但是,我不知道如何在 Pacdot 脚本中设置 ScoreValue。
这是 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>());
}
}
ScoreManager 脚本需要作为游戏对象或游戏对象中的组件存在。然后你可以将它作为一个字段添加到你的 Pacdot class.
它会像下面这样,但是找到脚本所附加的特定游戏对象将取决于您如何设计它(除非您有游戏,否则 "find by tag" 方法将不起作用附有 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 的答案——有很多方法可以实现,具体取决于您的 needs/design。
我正在制作吃豆人之类的 2D 游戏。尽管如此,我在创建评分系统时遇到了一些问题。
我想在我的吃豆人吃硬币时更新分数(a.k.a pacdot)
我制作了名为 'ScoreManager'
的 C# 脚本这是代码
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 引擎中玩我的游戏时,这段代码运行良好
但是,我不知道如何在 Pacdot 脚本中设置 ScoreValue。
这是 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>());
}
}
ScoreManager 脚本需要作为游戏对象或游戏对象中的组件存在。然后你可以将它作为一个字段添加到你的 Pacdot class.
它会像下面这样,但是找到脚本所附加的特定游戏对象将取决于您如何设计它(除非您有游戏,否则 "find by tag" 方法将不起作用附有 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 的答案——有很多方法可以实现,具体取决于您的 needs/design。