ЗАКЛЮЧЕНИЕ
В результате разработки была создана игра «Parasite Attack» на платформу
Android с помощью среды разработки Unity. В процессе работы были проведены:
аналитический обзор целевой аудитории, требований к приложению, были
разработаны и реализованы алгоритмы. Проведено тестирование и было выявлено,
что разработанная игра соответствует разработанным требований.
СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ
3. Руководство Unity [Электронный ресурс]: Unity-Руководство / Руководство по Unity- Режим доступа: http://docs.unity3d.com/ru/current/Manual/
. Что такое платформа Eclipse и как ее использовать? [Электронный ресурс]: IBM DeveloperWorks- Режим доступа: https://www.ibm.com/developerworks/ru/library/os-eclipse/
. Тарас Нудиев / Стоит ли переходить на Android studio? [Электронный ресурс]: Awesomedevelop- Режим доступа: http://awesomedevelop.blogspot.ru/2014/12/android-studio.html
. Unity VS GameMaker: Studio [Электронный ресурс]: Stopgame - Режим доступа: http://stopgame.ru/blogs/topic/58024
ПРИЛОЖЕНИЕ
Скрипты проекта
) BulletBehavior.csUnityEngine;System.Collections;class BulletBehavior : MonoBehaviour {float speed = 10;int damage;int type;GameObject target;Vector3 startPosition;Vector3 targetPosition;float distance;float startTime;GameManagerBehavior gameManager;
// Use this for initializationStart () {= Time.time;= Vector3.Distance (startPosition, targetPosition);gm = GameObject.Find("GameManager");= gm.GetComponent<GameManagerBehavior>();
}
// Update is called once per frameUpdate () {=target.transform.position;timeInterval = Time.time - startTime;.transform.position = Vector3.Lerp(startPosition, targetPosition, timeInterval * speed / distance);(gameObject.transform.position.Equals(targetPosition)) {(target != null) {
Transform healthBarTransform = target.transform.FindChild("HealthBar");
HealthBar healthBar = .gameObject.GetComponent<HealthBar>();.currentHealth -= Mathf.Max(damage, 0);(type==2){speedTarget= target.GetComponent<MoveEnemy>();(speedTarget.currentspeed==speedTarget.speed)
{.currentspeed*=0.5f;
}
}(healthBar.currentHealth <= 0) {(target);audioSource = target.GetComponent<AudioSource>();.PlayClipAtPoint(audioSource.clip, transform.position);.Gold += 50;
}
}(gameObject);
}
}
}
) GameManagerBehavior.csUnityEngine;System.Collections;UnityEngine.UI;class GameManagerBehavior : MonoBehaviour {GameObject TowerPref;Text goldLabel;int gold;Text waveLabel;GameObject[] nextWaveLabels;bool gameOver = false;int wave;Text healthLabel;GameObject[] healthIndicator;int health;int Gold {{ return gold; }{= value;.GetComponent<Text>().text = "GOLD: " + gold;
}
}
// Use this for initializationStart () {= 0;= 1000;= 5;
}
// Update is called once per frameUpdate () {
}int Health {{ return health; }{(value < health) {.main.GetComponent<CameraShake>().Shake();
}= value;.text = "HEALTH: " + health;(health <= 0 && !gameOver) {= true;gameOverText = GameObject.FindGameObjectWithTag ("GameOver");.GetComponent<Animator>().SetBool("gameOver", true);
}(int i = 0; i < healthIndicator.Length; i++) {(i < Health) {[i].SetActive(true);
} else {[i].SetActive(false);
}
}
}
}int Wave {{ return wave; }{= value;(!gameOver) {(int i = 0; i < nextWaveLabels.Length; i++) {[i].GetComponent<Animator>().SetTrigger("nextWave");
}
}.text = "WAVE: " + (wave + 1);
}
}
}
) MonsterData.csUnityEngine;System.Collections;System.Collections.Generic;UnityEngine.UI;
[System.Serializable]class MonsterLevel {int cost;GameObject visualization;GameObject bullet;float fireRate;
}class MonsterData : MonoBehaviour {List<MonsterLevel> levels;MonsterLevel currentLevel;Button SellB;Button UpgradeB;
// Use this for initializationStart () {
}
// Update is called once per frame
void Update () {
}MonsterLevel CurrentLevel {{currentLevel;
}{= value;currentLevelIndex = levels.IndexOf(currentLevel);levelVisualization = levels[currentLevelIndex].visualization;(int i = 0; i < levels.Count; i++) {(levelVisualization != null) {(i == currentLevelIndex) {[i].visualization.SetActive(true);
} else {[i].visualization.SetActive(false);
}
}
}
}
}OnEnable() {= levels[0];
}MonsterLevel getNextLevel() {currentLevelIndex = levels.IndexOf (currentLevel);maxLevelIndex = levels.Count - 1;(currentLevelIndex < maxLevelIndex) {levels[currentLevelIndex+1];
} else {null;
}
}void increaseLevel() {currentLevelIndex = levels.IndexOf(currentLevel);(currentLevelIndex < levels.Count - 1) {= levels[currentLevelIndex + 1];
}
}
}UnityEngine;System.Collections;class MoveEnemy : MonoBehaviour {
[HideInInspector]GameObject[] waypoints;int currentWaypoint = 0;float lastWaypointSwitchTime;float speed = 1.0f;float currentspeed;
// Use this for initializationStart () {= speed;= Time.time;
}
// Update is called once per frame
void Update () {
// 1
Vector3 startPosition = waypoints [currentWaypoint].transform.position;
Vector3 endPosition = waypoints [currentWaypoint + 1].transform.position;
// 2 pathLength = Vector3.Distance (startPosition, endPosition);
if (currentspeed != speed) {
}totalTimeForPath = pathLength / currentspeed;
float currentTimeOnPath = Time.time - lastWaypointSwitchTime;.transform.position = Vector3.Lerp (startPosition, endPosition, currentTimeOnPath / totalTimeForPath);
// 3 (gameObject.transform.position.Equals(endPosition)) {(currentWaypoint < waypoints.Length - 2) {
} else {
// 3.b (gameObject);
AudioSource audioSource = gameObject.GetComponent<AudioSource>();
AudioSource.PlayClipAtPoint(audioSource.clip, transform.position);gameManager =.Find("GameManager").GetComponent<GameManagerBehavior>();.Health -= 1;
}
}
}
) MoveEnemy.csfloat distanceToGoal() {distance = 0;+= Vector3.Distance(.transform.position, [currentWaypoint + 1].transform.position);(int i = currentWaypoint + 1; i < waypoints.Length - 1; i++) {startPosition = waypoints [i].transform.position;endPosition = waypoints [i + 1].transform.position;+= Vector3.Distance(startPosition, endPosition);
}distance;
}void RotateIntoMoveDirection() {newStartPosition = waypoints [currentWaypoint].transform.position;newEndPosition = waypoints [currentWaypoint + 1].transform.position;newDirection = (newEndPosition - newStartPosition);x = newDirection.x;y = newDirection.y;rotationAngle = Mathf.Atan2 (y, x) * 180 / Mathf.PI+90;sprite = (GameObject).transform.FindChild("Sprite").gameObject;.transform.rotation = .AngleAxis(rotationAngle, Vector3.forward);
}
}
) PlaceMonster.csUnityEngine;System.Collections;UnityEngine.UI;class PlaceMonster : MonoBehaviour {GameObject monsterPrefab;GameObject monster;GameManagerBehavior gameManager;Text test;
// Use this for initializationStart () {=.Find("GameManager").GetComponent<GameManagerBehavior>();
}
// Update is called once per frameUpdate () {
//monsterPrefab=gameManager.TowerPref;
}bool canPlaceMonster(){cost = monsterPrefab.GetComponent<MonsterData> ().levels[0].cost;monster == null && gameManager.Gold >= cost && monsterPrefab != null;
}OnMouseUp () {= gameManager.TowerPref;(canPlaceMonster ()) {
//if( monster==null && monsterPrefab!=null){= (GameObject)(monsterPrefab, transform.position, Quaternion.identity);audioSource = gameObject.GetComponent<AudioSource> ();.PlayOneShot (audioSource.clip);
gameManager.Gold -= monster.GetComponent<MonsterData> ().CurrentLevel.cost;
} else (canUpgradeMonster ()) {(monster != null) {
/*test.text="asa";.SetActive(true);.transform.position=new Vector3(2,2);*/.GetComponent<MonsterData> ().increaseLevel ();audioSource = gameObject.GetComponent<AudioSource> ();.PlayOneShot (audioSource.clip);.Gold -= monster.GetComponent<MonsterData> ().CurrentLevel.cost;
}
}
}bool canUpgradeMonster() {cost = monsterPrefab.GetComponent<MonsterData> ().levels[0].cost;(monster != null) {monsterData = monster.GetComponent<MonsterData> ();nextLevel = monsterData.getNextLevel();(nextLevel != null) {gameManager.Gold >= nextLevel.cost;
}
}false;
}
}
) ShootEnemies.csUnityEngine;System.Collections;System.Collections.Generic;class ShootEnemies : MonoBehaviour {List<GameObject> enemiesInRange;float lastShotTime;MonsterData monsterData;Start () {= new List<GameObject>();= Time.time;= gameObject.GetComponentInChildren<MonsterData> ();
}Update () {target = null;minimalEnemyDistance = float.MaxValue;(GameObject enemy in enemiesInRange) {distanceToGoal = enemy.GetComponent<MoveEnemy>().distanceToGoal();(distanceToGoal < minimalEnemyDistance) {= enemy;= distanceToGoal;
}
}(target != null) {(Time.time - lastShotTime > monsterData.CurrentLevel.fireRate) {(target.GetComponent<Collider2D>());= Time.time;
}direction = gameObject.transform.position - target.transform.position;.transform.rotation = Quaternion.AngleAxis(.Atan2 (direction.y, direction.x) * 180 / Mathf.PI,Vector3 (0, 0, 1));
}
}OnEnemyDestroy (GameObject enemy) {.Remove (enemy);
}OnTriggerEnter2D (Collider2D other) {(other.gameObject.tag.Equals("Enemy")) {.Add(other.gameObject);del =.gameObject.GetComponent<EnemyDestructionDelegate>();.enemyDelegate += OnEnemyDestroy;
}
}OnTriggerExit2D (Collider2D other) {(other.gameObject.tag.Equals("Enemy")) {.Remove(other.gameObject);del =.gameObject.GetComponent<EnemyDestructionDelegate>();.enemyDelegate -= OnEnemyDestroy;
}
}Shoot(Collider2D target) {bulletPrefab = monsterData.CurrentLevel.bullet; startPosition = gameObject.transform.position;targetPosition = target.transform.position;.z = bulletPrefab.transform.position.z;.z = bulletPrefab.transform.position.z;newBullet = (GameObject)Instantiate (bulletPrefab);.transform.position = startPosition;bulletComp = newBullet.GetComponent<BulletBehavior>();.target = target.gameObject;.startPosition = startPosition;.targetPosition = targetPosition;animator = .CurrentLevel.visualization.GetComponent<Animator> ();.SetTrigger ("fireShot");audioSource = gameObject.GetComponent<AudioSource>();.PlayOneShot(audioSource.clip);
}
}
) SpawnEnemy.csUnityEngine;System;System.Collections;
[System.Serializable]class Wave {GameObject[] enemyPrefab;float spawnInterval = 2;int maxEnemies = 20;
}class SpawnEnemy : MonoBehaviour {Wave[] waves;int timeBetweenWaves = 5;GameManagerBehavior gameManager;float lastSpawnTime;int enemiesSpawned = 0;GameObject[] waypoints;
// Use this for initializationStart () {
//Instantiate(testEnemyPrefab).GetComponent<MoveEnemy>().waypoints = waypoints;= Time.time;
//gameManager =GameObject.Find("GameManager").GetComponent<GameManagerBehavior>();
}
// Update is called once per frameUpdate () {currentWave = gameManager.Wave;.Random rng=new System.Random();number=rng.Next (0, waves [currentWave].enemyPrefab.Length);(currentWave < waves.Length) {timeInterval = Time.time - lastSpawnTime;spawnInterval = waves[currentWave].spawnInterval;(((enemiesSpawned == 0 && timeInterval > timeBetweenWaves) ||
timeInterval > spawnInterval) &&
enemiesSpawned < waves[currentWave].maxEnemies) { = Time.time;newEnemy = (GameObject)(waves[currentWave].enemyPrefab[number]);.GetComponent<MoveEnemy>().waypoints = waypoints;++;
}(enemiesSpawned == waves[currentWave].maxEnemies &&
GameObject.FindGameObjectWithTag("Enemy") == null) {.Wave++;.Gold = Mathf.RoundToInt(gameManager.Gold * 1.1f);= 0;= Time.time;
}
} else {.gameOver = true;gameOverText = GameObject.FindGameObjectWithTag ("GameWon");.GetComponent<Animator>().SetBool("gameOver", true);
}
}
}