Tank大战开发记录

2D图片的处理

1.普通图片,要把Texture Type从default改成Sprite(2D and UI)
2.图集(一大张里包含好多张),需要切割使用。切割方法:打开Sprite Editor,点击Slice,选择1:Automatic。一般可以应付绝大多数问题。如果再不行,就选择Grid by cell size。这里有个小技巧,可以先用选择1然后托拉线框测出一个需要的小图片像素大小,然后在利用选择Grid by cell size。

图片大小调整

因为unity的场景是以1m*1m为单位的,为了能看出我们的图片大小,可以选择创建一个cube(大小刚好是基准单位大小)来对比。
另外,当有一大堆2D素材需要调整和第一张图片一样大小时,可以之际ctrl+d复制第一张图,然后点Sprite边上的圆圈,接着把文件夹下的图片换进去。

预制体的制作

新建一个prefabs文件夹,然后直接把场景中的物体拖拽到该文件夹下。

动画

首先新建一个Animations和AnimatorController文件夹,用来存放动画和控制器。
接着,一个小技巧,帧动画:点击第一个图片,然后按住shift再点击最后一个图片,在全选的状态下拖入场景,就会自动生成一个动画文件。

控制角色移动

利用了虚拟按键(horizontal和vertical)+Transform.Translate()函数。

public float speed=3f;
void Update () {
   
        float h = Input.GetAxis("Horizontal");
        transform.Translate(Vector3.right*h*speed*Time.deltaTime,Space.World);
        float v = Input.GetAxis("Vertical");
        transform.Translate(Vector3.up*v*speed*Time.deltaTime,Space.World);
	}

解决角色移动不更换图片问题

首先先创建两个变量

private SpriteRenderer sr;
    public Sprite[] tankeSprite;

这里要把需要变换的几张图片拖拽到数组里。
然后获得组件

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

接着在Update()里逻辑判断

if (h < 0)
        {
   
            sr.sprite = tankeSprite[3];
        }
        if(h>0)
        {
   
            sr.sprite = tankeSprite[1];
        }
        float v = Input.GetAxis("Vertical");
        transform.Translate(Vector3.up*v*speed*Time.deltaTime,Space.World);
        if (v < 0)
        {
   
            sr.sprite = tankeSprite[2];
        }
        if (v > 0)
        {
   
            sr.sprite = tankeSprite[0];
        }

碰撞器添加以及解决物体抖动问题

这里要注意添加的碰撞器和刚体组件都是xxxx2D的。
解决抖动问题的方法:
原理因为物体之间发生了交互,但是因为每一帧的秒数因为计算机的机能问题有所偏差,所以会出现运动的距离不同,所以看起来是抖动的。
解决方法就是放在FixedUpdate()里。Time.deltaTime改成Time.fixeDeltaTime.

解决两个按键同时按下的bug

设立优先级:

 if (h > 0)
        {
   
            sr.sprite = tankeSprite[1];
        }
        if (h != 0)
        {
   
            return;
        }
        float v = Input.GetAxis("Vertical");
        transform.Translate(Vector3.up * v * speed * Time.fixedDeltaTime, Space.World);
        if (v < 0)

在这个位置加一个if(h!=0),如果按键被按下了,那么就返回。

2D渲染层级问题

在这里插入图片描述
控制渲染层级的Sort Layer和Order in Layer
这里我们使用Order in Layer,0到5.数字小的先渲染,同时也是会被垫在下层。

攻击的方法实现

//坦克的攻击方法
    private void Attack()
    {
   
        if (Input.GetKeyDown(KeyCode.Space))
        {
   
            //子弹产生的角度:当前坦克的角度+子弹应该旋转的角度
            Instantiate(bulletPrefab,transform.position,transform.rotation);
        }
    }
但是我们发现子弹图片不能转向,且实例化后没有速度
Vector3 bulletEulerAngles;
 private void Attack()
    {
   
        if (Input.GetKeyDown(KeyCode.Space))
        {
   
            //子弹产生的角度:当前坦克的角度+子弹应该旋转的角度
            Instantiate(bulletPrefab,transform.position,Quaternion.Euler(transform.eulerAngles+bulletEulerAngles));
        }
    }
子弹的转向问题已经解决了,接下来解决速度问题。

在这里插入图片描述
新建一个脚本

 public Transform bullet;
    public float speed = 10f;
	// Use this for initialization
	void Start () {
   
        bullet = GetComponent<Transform>().transform;
	}
	
	// Update is called once per frame
	void Update () {
   
        bullet.Translate(transform.up * speed * Time.deltaTime, Space.World);
	}

这里要注意一定要获取到引用,不然下面调用的时候无效。

攻击CD的设置

新定义一个定时器

//计时器
    private void jishiqi()
    {
   
        if (timeVal >= 0.4f)
        {
   
            Attack();

        }
        else
        {
   
            timeVal += Time
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值