using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TankMovers : MonoBehaviour {
// 前进后退
[SerializeField]int moveSpeed;
// 左右旋转
[SerializeField]int turnSpeed;
// 炮击位置对象所属的层的层号
[SerializeField]int targetLayerNum;
// 炮击位置对象组件
[SerializeField]Transform target;
// 炮击位置对象默认离地高度
[SerializeField]float targetY;
// 瞄准器对象组件
[SerializeField]Transform turretTarget;
// 炮塔对象
[SerializeField]Transform turret;
// 炮塔的旋转角速率
[SerializeField]float turretTurnSpeed;
// 爆炸粒子特效预制件
[SerializeField]GameObject explode;
// 炮口是否已经瞄准目标
bool readyToFire=false;
// 炮弹是否已经填装完毕
bool reloaded=true;
// 炮弹填装时间间隔
[SerializeField]float reloadTime;
// Use this for initialization
void Update(){
Move();
TurretTurn();
Fire();
}
// Update is called once per frame
void Move(){
transform.position=transform.position+transform.forward*Input.GetAxis("Vertical")*(moveSpeed*Time.deltaTime);
Vector3 newPosition=transform.position+transform.forward*Input.GetAxis ("Vertical")*(moveSpeed*Time.deltaTime);
Quaternion newRotation=transform.rotation*Quaternion.Euler(0,turnSpeed*Input.GetAxis("Horizontal")*Time.deltaTime,0);
transform.SetPositionAndRotation (newPosition, newRotation);
}
void TurretTurn(){
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray,out hit,Mathf.Infinity,1<<targetLayerNum)){
target.position=new Vector3(hit.point.x,targetY,hit.point.z);
target.gameObject.SetActive(true);
turretTarget.LookAt(new Vector3(hit.point.x,turretTarget.position.y,hit.point.z));
turret.rotation=Quaternion.RotateTowards(turret.rotation,turretTarget.rotation,turretTurnSpeed*Time.deltaTime);
}else{target.gameObject.SetActive(false);}
}
void Fire(){
if(turret.rotation=turretTarget.rotation){
readyToFire=true;
}else{
readyToFire=false;
}
if(Input.GetMouseButtonDown(0)&&readyToFire&&reloaded){
Ray ray=new Ray(turret.position,turret.forward);
RaycastHit hit;
Vector3 lookatPosition=new Vector3(target.position.x,turret.position.y,target.position.z);
if(Physics.Raycast(ray,out hit,Vector3.Distance(turret.position,lookatPosition))){
Instantiate(explode,hit.point,Quaternion.identity);
} else {
Instantiate(explode,target.position,Quaternion.identity);
}
reloaded=false;
StartCoroutine(WaitUntillReloaded());
}
}
IEnumerator WaitUntillReloaded(){
yield return new WaitForSeconds(reloadTime);
reloaded=true;
}
}
你好,我是有问必答小助手。为了技术专家团更好地为您解答问题,烦请您补充下(1)问题背景详情,(2)您想解决的具体问题,(3)问题相关代码图片或者报错信息。便于技术专家团更好地理解问题,并给出解决方案。
您可以点击问题下方的【编辑】,进行补充修改问题。