unity坦克大战学习笔记

项目创建

1、创建unity项目,选择2D > 项目名Tank > 创建
2、打开Assets
3、导入GameResource.unitypackage资源文件

资源处理

1、将资源中的坦克导入Hierarchy中,并更改资源大小 x 和 y 为 3

在这里插入图片描述
在这里插入图片描述

将墙Wall、钢铁墙Barriar、草地Grass、心脏Heart导入中Hierarchy中

2、制造动画

选中Born中的所有图片,拉入Hierarchy,修改名为Born,将制造动画产生的资源分别放入Animation和AnimationController中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、预制体

将资源分别拖入预制体文件夹Prefobs下的Effect(动画资源)和Map(非动画资源)中

在这里插入图片描述

4、碰撞检测

为Player添加碰撞检测和刚体

在这里插入图片描述

为Barriar、Heart、River、Wall添加碰撞检测

防止刚体重力效果的下降和碰撞后坦克的旋转,进行如下设置数值,其中选中z前面的空格为碰撞后锁定z轴不旋转,并且将Gravity Scale(重力)设置为0.

在这里插入图片描述

5、坦克移动,发射子弹

创建脚本并拖到到组件中,其中子弹和坦克属性值对应的图片在如图位置

在这里插入图片描述
坦克的方向控制采用的是四张图片按照脚本中方法控制显示
在这里插入图片描述子弹的方向控制采用的是一张图片按照脚本中图片实例化方法的第三个参数进行控制角度
在这里插入图片描述

Player.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    
    

    //属性值
    public float moveSpeed = 3;
    private Vector3 bullectEulerAngles;
    
    //引用
    public Sprite[] tankSprite; //上 右 下 左
    private SpriteRenderer sr;
    public GameObject bullectPrefab; //子弹的预制体

    private void Awake()
    {
    
    
        sr = GetComponent<SpriteRenderer>();
    }

    // Start is called before the first frame update
    void Start()
    {
    
    
        
    }

    // Update is called once per frame
    void Update()
    {
    
    
        Attack();
    }

    private void FixedUpdate()
    {
    
    
        
        Move();
    }

    //坦克的攻击方法
    private void Attack()
    {
    
    
        if (Input.GetKeyDown(KeyCode.Space))
        {
    
    
            //子弹产生的角度:当前坦克的角度+子弹应该旋转的角度。
            Instantiate(bullectPrefab, transform.position, Quaternion.Euler(transform.eulerAngles+bullectEulerAngles));
        }
    }

    //坦克的移动方法
    public void Move()
    {
    
    
        float v = Input.GetAxisRaw("Vertical");
        transform.Translate(Vector3.up * v * moveSpeed * Time.deltaTime, Space.World);

        if (v < 0)
        {
    
    
            sr.sprite = tankSprite[2];

            bullectEulerAngles = new Vector3(0, 0, 180);
        }
        else if (v > 0)
        {
    
    
            sr.sprite = tankSprite[0];

            bullectEulerAngles = new Vector3(0, 0, 0);
        }

        if (v != 0)
        {
    
    
            return;
        }

        float h = Input.GetAxisRaw("Horizontal");
        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);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44923787/article/details/122699548