Unity坦克大战开发全流程——游戏场景——敌人——移动的敌人
2023-12-31 15:56:04
游戏场景——敌人——移动的敌人
制作预制体
将坦克拖拽至场景中进行设置
写代码
让坦克在两点之间不停移动
随机坐标函数
然后在start()中调用即可
坦克要一直盯着玩家
当小于一定距离时,攻击玩家
重写开火逻辑
注意还要将其tag改成Monster!
当敌人死亡后,增加分数
重写死亡逻辑
最后再为敌人添加死亡特效即可
直到当前MonsterTank的代码为:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MonsterTank : TankBaseObj
{
//坦克移动的目标地点
public Transform targetPos;
//坦克的随机坐标位置(在unity中进行关联)
public Transform[] randomPos;
//坦克炮台看向的目标
public Transform lookAtTarget;
//开火距离
public int fireDis = 10;
//检测时间
public int fireOffsetTime = 1;
public float nowTime = 0;
//子弹与炮口
public GameObject bullet;
public Transform[] shootPos;
//关联的图片
public Texture maxHPBK;
public Texture hpBK;
//图片的坐标
private Rect maxHPRect;
private Rect hpRect;
//显示血条计时时间
private float showTime;
void Start()
{
RandomPos();
}
// Update is called once per frame
void Update()
{
#region 让坦克在两点之间不停移动
//控制坦克的移动
transform.LookAt(targetPos);
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
//检测坐标距离
if (Vector3.Distance(transform.position, targetPos.position) < 0.5f)
{
RandomPos();
}
#endregion
#region 坦克要一直盯着玩家
if (lookAtTarget != null)
{
transform.LookAt(lookAtTarget);
//当与玩家的距离小于开火距离时,进行攻击
if(Vector3.Distance(transform.position,lookAtTarget.position) < fireDis)
{
nowTime += Time.deltaTime;
if (nowTime >= fireOffsetTime)
{
Fire();
nowTime = 0;
}
}
}
#endregion
}
public void RandomPos()
{
if (randomPos.Length <= 0)
return;
targetPos = randomPos[Random.Range(0, randomPos.Length)];
}
public override void Fire()
{
//有多少个炮口就创建多少个子弹
for (int i = 0; i < shootPos.Length; i++)
{
GameObject obj = Instantiate(bullet, shootPos[i].transform.position, shootPos[i].transform.rotation);
//控制子弹做什么
BulletObj bulletObj = obj.GetComponent<BulletObj>();
bulletObj.SetFather(this);
}
}
public override void Dead()
{
base.Dead();
//增加分数
GamePanel.Instance.AddScore(10);
}
private void OnGUI()
{
if (showTime > 0)
{
showTime -= Time.deltaTime;
//设置坐标
Vector3 screenPos = UnityEngine.Camera.main.WorldToScreenPoint(transform.position);
screenPos.y = Screen.height - screenPos.y;
//绘制底图
maxHPRect.x = screenPos.x - 50;
maxHPRect.y = screenPos.y - 50;
maxHPRect.width = 100;
maxHPRect.height = 15;
GUI.DrawTexture(maxHPRect, maxHPBK);
//绘制血条
hpRect.x = screenPos.x - 50;
hpRect.y = screenPos.y - 50;
hpRect.width = (float)hp / maxHP * 100f;
hpRect.height = 15;
GUI.DrawTexture(hpRect, hpBK);
}
}
public override void Wound(TankBaseObj other)
{
base.Wound(other);
showTime = 3;
}
}
文章来源:https://blog.csdn.net/Yukino_youth/article/details/135316042
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!