介绍
类似战斗球
知识点
- 列表
- 两个脚本内的变量的调用(代码中涉及三种方法)
- 预制体
- 谁想谁奔跑
- 按键控制相机视角
- 刚体碰撞体
源码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotateCameraX : MonoBehaviour
{
private float speed = 200;
public GameObject player;
// Update is called once per frame
void Update()
{
float horizontalInput = Input.GetAxis("Horizontal");
transform.Rotate(Vector3.up, horizontalInput * speed * Time.deltaTime);
transform.position = player.transform.position; // Move focal point with player
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpawnManagerX : MonoBehaviour
{
public GameObject enemyPrefab;
public GameObject powerupPrefab;
private float spawnRangeX = 10;
private float spawnZMin = 15; // set min spawn Z
private float spawnZMax = 25; // set max spawn Z
//private int enemySpeed=500;
public int enemyCount;
public int waveCount = 1;
//private List<GameObject> enemyList=new List<GameObject>();//列表类似数组,不同的是数组长度固定,列表长度不固定
//public EnemyX enemyX;
public GameObject player;
//public GameObject enemy;//如果此处在场景中拖进来预制体,是不对的,因为预制体是文件,使用前应该对其实例化
public int enemySpeed = 500;
private void Start()
{
// enemyX = GameObject.Find("Enemy").GetComponent<EnemyX>();//GameObject.Find("Enemy")当场景中有很多enemy时只返回找到的第一个对象,所以后面改变敌人速度也只是改变了第一个敌人的速度
//enemyPrefab = GameObject.Find("Enemy");//也是不行的,预制体Enemy,Find只能找场景中有的,预制体克隆之后才会有对象,而克隆代码在此位置之后
}
// Update is called once per frame
void Update()
{
enemyCount = GameObject.FindGameObjectsWithTag("Enemy").Length;
if (enemyCount == 0)
{
enemySpeed += 25;
SpawnEnemyWave(waveCount);
//foreach(GameObject enemy in enemyList)//每次从列表取出一个前面实例化的敌人对象
//{
// EnemyX enemyX=enemy.GetComponent<EnemyX>();
// enemyX.speed = enemySpeed;
//}
//enemyList.Clear();//列表清空,因为前一波撞击掉的球已经被销毁了,不能再访问了
//enemyX.speed += 25;
}
}
// Generate random spawn position for powerups and enemy balls
Vector3 GenerateSpawnPosition ()
{
float xPos = Random.Range(-spawnRangeX, spawnRangeX);
float zPos = Random.Range(spawnZMin, spawnZMax);
return new Vector3(xPos, 0, zPos);
}
void SpawnEnemyWave(int enemiesToSpawn)
{
Vector3 powerupSpawnOffset = new Vector3(0, 0, -15); // make powerups spawn at player end
// If no powerups remain, spawn a powerup
if (GameObject.FindGameObjectsWithTag("Powerup").Length == 0) // check that there are zero powerups
{
Instantiate(powerupPrefab, GenerateSpawnPosition() + powerupSpawnOffset, powerupPrefab.transform.rotation);
}
// Spawn number of enemy balls based on wave number
for (int i = 0; i < enemiesToSpawn; i++)
{
Instantiate(enemyPrefab, GenerateSpawnPosition(), enemyPrefab.transform.rotation);
//GameObject enemy= Instantiate(enemyPrefab, GenerateSpawnPosition(), enemyPrefab.transform.rotation);
// //enemyList.Add(enemy);
// EnemyX enemyX = enemy.GetComponent<EnemyX>();
// enemyX.speed = enemySpeed;
}
//enemySpeed += 25;
waveCount++;
ResetPlayerPosition(); // put player back at start
}
// Move player back to position in front of own goal
void ResetPlayerPosition ()
{
player.transform.position = new Vector3(0, 1, -7);
player.GetComponent<Rigidbody>().velocity = Vector3.zero;
player.GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerControllerX : MonoBehaviour
{
private Rigidbody playerRb;
private float speed = 500;
private GameObject focalPoint;
public bool hasPowerup;
public GameObject powerupIndicator;
public int powerUpDuration = 5;
private float normalStrength = 10; // how hard to hit enemy without powerup
private float powerupStrength = 25; // how hard to hit enemy with powerup
private int turboBoost = 10;
public ParticleSystem smokePartical;
void Start()
{
playerRb = GetComponent<Rigidbody>();
focalPoint = GameObject.Find("Focal Point");
}
void Update()
{
// Add force to player in direction of the focal point (and camera)
float verticalInput = Input.GetAxis("Vertical");
playerRb.AddForce(focalPoint.transform.forward * verticalInput * speed * Time.deltaTime);
// Set powerup indicator position to beneath player
powerupIndicator.transform.position = transform.position + new Vector3(0, -0.6f, 0);
if (Input.GetKeyDown(KeyCode.Space))
{
playerRb.AddForce(focalPoint.transform.forward * turboBoost, ForceMode.Impulse);
smokePartical.Play();
}
}
// If Player collides with powerup, activate powerup
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("Powerup"))
{
Destroy(other.gameObject);
hasPowerup = true;
powerupIndicator.SetActive(true);
StartCoroutine(PowerupCooldown());//或者StartCoroutine("PowerupCooldown");
}
}
// Coroutine to count down powerup duration
IEnumerator PowerupCooldown()
{
yield return new WaitForSeconds(powerUpDuration);
hasPowerup = false;
powerupIndicator.SetActive(false);
}
// If Player collides with enemy
private void OnCollisionEnter(Collision other)
{
if (other.gameObject.CompareTag("Enemy"))
{
Rigidbody enemyRigidbody = other.gameObject.GetComponent<Rigidbody>();
Vector3 awayFromPlayer = other.gameObject.transform.position-transform.position ;
if (hasPowerup) // if have powerup hit enemy with powerup force
{
enemyRigidbody.AddForce(awayFromPlayer * powerupStrength, ForceMode.Impulse);
}
else // if no powerup, hit enemy with normal strength
{
enemyRigidbody.AddForce(awayFromPlayer * normalStrength, ForceMode.Impulse);
}
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyX : MonoBehaviour
{
public float speed;
private Rigidbody enemyRb;
private GameObject playerGoal;
public SpawnManagerX spawnManagerX;
// Start is called before the first frame update
void Start()
{
enemyRb = GetComponent<Rigidbody>();
playerGoal = GameObject.Find("Player Goal");
spawnManagerX = GameObject.Find("Spawn Manager").GetComponent<SpawnManagerX>();
speed = spawnManagerX.enemySpeed;
}
// Update is called once per frame
void Update()
{
// Set enemy direction towards player goal and move there
Vector3 lookDirection = (playerGoal.transform.position - transform.position).normalized;
enemyRb.AddForce(lookDirection * speed * Time.deltaTime);
}
private void OnCollisionEnter(Collision other)
{
// If enemy collides with either goal, destroy it
if (other.gameObject.name == "Enemy Goal")
{
Destroy(gameObject);
}
else if (other.gameObject.name == "Player Goal")
{
Destroy(gameObject);
}
}
}