2016-08-11 8 views
0

그래서 생성 된 개체를 점차적으로 움직 이도록 만드는 방법이 있다면 플레이어 (사용자)가 10 점을 수집 한 후에 더 빨리 이동하게하는 방법이 있는지 궁금합니다. 플레이어가 10 점을 더 받으면 더 빨리?Unity2D : 플레이어가 10 점을 수집 한 후 스폰 오브젝트를 점차 빠르게 만드는 방법은 무엇입니까?

이 내 운동 스크립트에서 양산 얻을 내 개체에 연결할 수 있습니다 :

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

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

이 내 점수 스크립트 내 선수

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 스크립트입니다 :

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]); 
      } 
     } 
    } 
} 

}

당신 : 모든

+0

참고로 답변을받을 수 있습니다. 대부분의 오래된 질문에는주의가 필요합니다. 이를 수행하는 방법은 [this] (http://meta.stackexchange.com/a/5235)를 참조하십시오. 그들이 당신을 위해 일하지 않았다면 당신은 항상 그 대답에 대해 논평 할 수 있습니다. – Programmer

답변

1

먼저 감사 (이 스크립트는 관리자에 표시 할 그것을 참조하는 generateEnemyCustomEditor 스크립트를 가지고), public static int movespeed = 20;에서 static 키워드를 제거하고 스크립트 인스턴스 경우를 얻을 수 GameObject.Find("ObjectMovementIsAttachedTo").GetComponent<Movement>();를 사용 다른 스크립트에서 변수 movespeed을 수정하려고합니다.

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

솔루션은 곧장 켜져 있습니다. Score가 그 조건이 true 경우 원하는 값으로 movespeed을 증가 (10)에 의해 증가 있는지 확인하는

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

를 사용합니다. 점수가 1만큼 증가한 후에 OnTriggerEnter2D 함수에 넣는 것이 좋습니다.

score 스크립트 : 당신의 Movement 스크립트가 인스턴스화되기 때문에

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(); 
    } 
} 

, 당신이 그것을 인스턴스화 할 때, 당신은 플레이어의 스크립트에의 참조를 보냅니다.

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); 
    } 
} 
+0

고마워요, 지금 휴대폰으로 가고 있어요. 내가 집에 돌아 가면 한번 시도해 볼께. –

+0

죄송합니다. 게임을 할 때 오류가 발생했습니다. NullReferenceException : 객체 참조가 객체의 인스턴스로 설정되지 않았습니다. Movements.SetScoreText() (Assets/Script/Movement.cs에서 : 41). 나는 스코어 텍스트를 [박스] (http://imgur.com/ESRGA3g)로 옮겨 보았지만 그것을 허용하지 않을 것이다! –

+0

내 물건이 조립식이기 때문에 생각합니다 –