Unity2D:玩家收集10点后如何使生成对象逐渐加快速度? [英] Unity2D: How to make spawn object gradually go faster after the player collects 10 points?

查看:107
本文介绍了Unity2D:玩家收集10点后如何使生成对象逐渐加快速度?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我想知道是否有一种方法可以使玩家(您的用户)收集10点后使生成的物体逐渐移动/移动得更快.而当玩家又获得10分之类的东西时,速度更快吗?

so I was wondering if there was a way to make a spawned object gradually moves/go faster after the player (you the user) collects 10 points. And faster when the player collects another 10 points and so on and so on?

这是我的运动脚本,附加到我生成的对象上:

This is my movement script attach to my objects that get spawned in:

public class Movement : MonoBehaviour
  {
   public static int movespeed = 20;
   public Vector3 userDirection = Vector3.right;

public void Update()
 {
    transform.Translate(userDirection * movespeed * Time.deltaTime); 
 }
}

这是我附在播放器上的得分脚本

This is my score script attach to my player

public int Score;
public Text ScoreText;

void Start ()
{
    Score = 0;
    SetScoreText ();
}

void OnTriggerEnter2D(Collider2D other)
{
    if (other.gameObject.CompareTag ("Pick Up")) 
    {
        other.gameObject.SetActive (false);
        Score = Score + 1;
        SetScoreText ();
    }
}

void SetScoreText ()
{
    ScoreText.text = "Score: " + Score.ToString ();
} 

这是我的generateEnemy脚本:

And this is my generateEnemy script:

public GameOverManager gameOverManager = null;

[HideInInspector]
public float minBlobSpawnTime = 2;
[HideInInspector]
public float maxBlobSpawnTime = 5;
[HideInInspector]
public bool generateBlobs = true;
[HideInInspector]
public GameObject blobPrefab = null;
[HideInInspector]
public GameObject blobRoot = null;
[HideInInspector]
public float minimumYPosition = -0.425f;
[HideInInspector]
public float maximumYPosition = 0.35f;

[HideInInspector]
public float minDaggerSpawnTime = 2;
[HideInInspector]
public float maxDaggerSpawnTime = 5;
[HideInInspector]
public bool generateDaggers = true;
[HideInInspector]
public GameObject daggerPrefab = null;
[HideInInspector]
public GameObject daggerRoot;
[HideInInspector]
public float minimumXPosition = -11.5f;
[HideInInspector]
public float maximumXPosition = 11.5f;

public Camera camera = null;

// Use this for initialization
void Start ()
{
    generateBlobs = ((generateBlobs) && (blobPrefab != null) && (blobRoot != null));
    generateDaggers = ((generateDaggers) && (daggerPrefab != null) && (daggerRoot != null));

    if (camera == null)
    {
        Debug.LogError("GenerateEnemy: camera is not set in the inspector. Please set and try again.");
        camera = Camera.main;
    }

    if (gameOverManager == null)
    {
        Debug.LogError("GenerateEnemy: gameOverManager not set in the inspector. Please set and try again.");
    }

    if (generateBlobs)
    {
        StartCoroutine(GenerateRandomEnemy(true, blobPrefab, blobRoot, minBlobSpawnTime, maxBlobSpawnTime));
    }

    if (generateDaggers)
    {
        StartCoroutine(GenerateRandomEnemy(false, daggerPrefab, daggerRoot, minDaggerSpawnTime, maxDaggerSpawnTime));
    }
}

// Update is called once per frame
void Update ()
{
    DestroyOffScreenEnemies();
}

// Spawn an enemy
IEnumerator GenerateRandomEnemy(bool generateOnYAxis, GameObject prefab, GameObject root, float minSpawnTime, float maxSpawnTime)
{
    if ((prefab != null) && (gameOverManager != null))
    {
        if (!gameOverManager.GameIsPaused())
        {
            GameObject newEnemy = (GameObject) Instantiate(prefab);
            newEnemy.transform.SetParent(root.transform, true);

            // set this in the prefab instead
            // newEnemy.transform.position = new Vector3(newEnemy.transform.parent.position.x, 0.5f, newEnemy.transform.parent.position.z);

            // or if you want the y position to be random you need to do something like this
            if (generateOnYAxis)
            {
                newEnemy.transform.position = new Vector3(newEnemy.transform.parent.position.x, Random.Range(minimumYPosition, maximumYPosition), newEnemy.transform.parent.position.z);
            }
            else
            {
                newEnemy.transform.position = new Vector3(Random.Range(minimumXPosition, maximumXPosition), newEnemy.transform.parent.position.y, newEnemy.transform.parent.position.z);
            }
        }
    }
    yield return new WaitForSeconds(Random.Range(minSpawnTime, maxSpawnTime));

    StartCoroutine(GenerateRandomEnemy(generateOnYAxis, prefab, root, minSpawnTime, maxSpawnTime));
}

public void DestroyOffScreenEnemies()
{
    GameObject[] enemies = GameObject.FindGameObjectsWithTag("enemy");
    if ((enemies.Length > 0) && (camera != null))
    {
        for  (int i = (enemies.Length - 1); i >= 0; i--)
        {
            // just a precaution
            if ((enemies[i] != null) && ((camera.WorldToViewportPoint(enemies[i].transform.position).x > 1.03f) || 
                                         (enemies[i].transform.position.y < -6f)))
            {
                Destroy(enemies[i]);
            }
        }
    }
}

}

(此脚本具有一个引用它的generateEnemyCustomEditor脚本,以显示在检查器中)

(This script has an generateEnemyCustomEditor script that references it, to show in the inspector)

谢谢:)

推荐答案

首先,如果要修改movespeed变量,请从public static int movespeed = 20;中删除static关键字,并使用GameObject.Find("ObjectMovementIsAttachedTo").GetComponent<Movement>();获取脚本实例.来自另一个脚本.

First of all, remove the static keyword from public static int movespeed = 20; and use GameObject.Find("ObjectMovementIsAttachedTo").GetComponent<Movement>(); to get the script instance if you want to modify movespeed variable from another script.

当玩家再收集10点等等时,速度更快 上吗?

And faster when the player collects another 10 points and so on and so on?

解决方案直接解决.使用

The solution is straight on. Use

if (Score % 10 == 0){
  //Increement by number (4) movespeed from Movement script
    movement.movespeed += 4;
} 

检查Score是否增加10,然后如果条件为true,则将movespeed增加所需的任何值.在将Score增加1之后,将其放在OnTriggerEnter2D函数中是很有意义的.

to check if the Score is increased by 10 then increment movespeed by any value you want if that condition is true. It makes sense to put that in the OnTriggerEnter2D function after Score is incremented by 1.

您的新score脚本:

public class score : MonoBehaviour
{
    public int Score;
    public Text ScoreText;

    private int moveSpeed;

    void Start()
    {
        Score = 0;
        SetScoreText();
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.CompareTag("Pick Up"))
        {
            other.gameObject.SetActive(false);
            Score = Score + 1;
            if (Score % 10 == 0)
            {
                //Increement by number (4) movespeed from Movement script
                moveSpeed += 4;
            }
            SetScoreText();
        }
    }

    public int getMoveSpeed()
    {
        return moveSpeed;
    }

    void SetScoreText()
    {
        ScoreText.text = "Score: " + Score.ToString();
    }
}

由于将实例化Movement脚本,因此在实例化它时,会将其引用发送到Player脚本.

Since your Movement script will be instantiated, when you instantiate it, you send its reference to the Player script.

public class Movement : MonoBehaviour
{
    public int movespeed = 20;
    public Vector3 userDirection = Vector3.right;

    score mySpeed;

    void Start()
    {
        //Send Movement instance to the score script
        GameObject scoreGameObject = GameObject.Find("GameObjectScoreIsAttachedTo");
        mySpeed = scoreGameObject.GetComponent<score>();
    }

    public void Update()
    {
        transform.Translate(userDirection * mySpeed.getMoveSpeed() * Time.deltaTime);
    }
}

这篇关于Unity2D:玩家收集10点后如何使生成对象逐渐加快速度?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆