【unity】坦克大战主代码

本文介绍了Unity开发的坦克大战游戏中,包括Player主代码、出生(Born)逻辑、子弹(bullet)系统以及老家(Home)和地图实例化的关键实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做了个坦克大战的游戏,把主要代码再重新梳理了一下,方便以后温故知新。

Player主代码

public class Player : MonoBehaviour
{
   
    //属性值
    public float moveSpeed = 3;//坦克的移动的速度,当public的时候,就能在unity里面直接调
    private Vector3 bullectEulerAngles;//射出时,子弹的方向,在坦克移动的时候使用,判断坦克方向的同时就可以顺便把子弹的方向转过来。
    private float timeVal; //坦克攻击时的计时器,引用在射击间隔
    public float defendTimeVal=3;//出生时候,被保护的时间
    private bool isDefended=true;//判断是否被保护,c#里面的bool值默认是false,除非定义的时候就给他赋值

    //引用
    private SpriteRenderer sr;//SpriteRenderer就是用来在scene里面渲染出图像,通过Sprite Renderer中的sprite属性选择一个sprite对象显示在视野中。
    //这里定义一个sr,之后可以直接用sr.来调用这个图像的显示
    public  Sprite[] tankSprite; //上右下左 创建一个sprite数组,用来存放坦克的朝向不同的图片
    //用来判断朝向的时候,调用哪一个图片,实现视觉上的转向
    public GameObject bullectPrefab;//子弹的预设体
    public GameObject explosionPrefab;//爆炸特效的预设体
    public GameObject defendEffectPrefab;//保护特效的预设体


    private void Awake()//脚本加载的时候执行的代码(脚本挂载在场景内的物体这个物体必须是激活的挂在它身上脚本激活或者不激活都会被执行)
    {
   
        sr = GetComponent<SpriteRenderer>();//GetComponent是访问游戏对象的组件的方法
        //比较常规的方式是GetComponent<Rigidbody>().mass = 20;
        //这样就是可以把rigidbody中的mass属性变成了20;
        //用sr来替代,sr.sprite = tankSprite[3];就是把sprite变换成为数组3的位置
    }


    
    // Start is called before the first frame update
    void Start()//在脚本运行的时候运行一次
    {
   
        
    }
    private void FixedUpdate()//每秒根据你所定的每一帧的执行时间来计算,你要定义是每帧执行时间为0.02秒,那你用1/0.02那就是每秒执行50次
    {
   
        Move();//调用移动方法
    }
    // Update is called once per frame
    
    void Update()
    {
   
        //是否处于无敌状态
        if (isDefended)//一开始在上面定义的时候是用的true
        {
   
            defendEffectPrefab.SetActive(true);//SetActive是设置GameObject对象的显示和关闭
            //这里还有一个enable,是用来设置GameObject组件的开启和关闭
            defendTimeVal -= Time.deltaTime;//Time.deltaTime指完成上一帧所用的时间
            if (defendTimeVal <= 0)
            {
   
                isDefended = false;
                defendEffectPrefab.SetActive(false);//保护罩就消失了
            }
        }

        //攻击时的CD
        if (timeVal>=0.5f)//当间隔大于了0.5f时候,就可以执行
        {
   
            Attack();
        }
        else
        {
   
            timeVal += Time.deltaTime;//在执行完了Attack之后,会把timeVal重新变成0;
        }
  
    
    }
   
    //坦克移动方法
    private void Move()
    {
   
        float h = Input.GetAxisRaw("Horizontal");//根据设置(unity一开始设置好了)返回-1,1这种值,当你键盘按下左右的时候,左就是-1,右就是1
        //使小球按照y轴正方向以每帧1的单位长度移动 transform.Translate(Vector3.up * Time.deltaTime, Space.World);最后的坐标,可以是自身坐标,或者是世界坐标,如果不写就自动是自身坐标
        transform.Translate(Vector3.right * h * moveSpeed * Time.deltaTime, Space.World);
        if (h < 0)
        {
   
            sr.sprite = tankSprite[3];
            bullectEulerAngles = new Vector3(0, 0, 90);
        }
        else if (h > 0)
        {
   
            sr.sprite = tankSprite[1];
            bullectEulerAngles = new Vector3(0, 0, -90);
        }
        if (h != 0) //添加优先级
        {
   
            return;
        }

        float v = Input.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值