Unity入门案例-Tanks坦克大战

这是我的第一个Unity项目精简版的坦克大战看着siki视频学着做的历时一天半。

游戏描述:

游戏由2个玩家控制,每个玩家可以控制坦克前进后退左转右转和攻击,每个玩家有100hp基础血量每次攻击随机造成10-20点伤害。当某个玩家血量低于0时他操控的坦克被摧毁并且游戏结束。

我的工作:

一、坦克的移动脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TankMovement : MonoBehaviour {
    public float speed = 5;
    public float angularSpeed = 7;
    public float number = 1;
    private Rigidbody rigidbody;
    public AudioClip idleAudio;
    public AudioClip drivingAudio;
    private AudioSource audio;
	// Use this for initialization
	void Start () {
        rigidbody = this.GetComponent<Rigidbody>();
        audio = this.GetComponent<AudioSource>();
	}

    // Update is called once per frame
    private void FixedUpdate() {
        float v = Input.GetAxis("VerticalPlayer"+number);
        float h = Input.GetAxis("HorizontalPlayer" + number);
        rigidbody.velocity = transform.forward * v * speed;
        rigidbody.angularVelocity = transform.up * h * angularSpeed;
        if (Mathf.Abs(h) > 0.1 || Mathf.Abs(v) > 0.1) {
            audio.clip = drivingAudio;
            if (audio.isPlaying == false) 
            audio.Play();
        }
        else {
            audio.clip = idleAudio;
            if (audio.isPlaying == false)
            audio.Play();
        }
	}
}
二、坦克的攻击脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TankAttack : MonoBehaviour {
    private Transform firePosition;
    public GameObject shellPrefab;
    public KeyCode fireKey = KeyCode.Space;
    public float shellSpeed = 10;
    public AudioClip shotAudio;
	// Use this for initialization
	void Start () {
        firePosition = transform.Find("FirePosition");
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKeyDown(fireKey)) {
            AudioSource.PlayClipAtPoint(shotAudio, transform.position);
            GameObject go = GameObject.Instantiate(shellPrefab, firePosition.position, firePosition.rotation) as GameObject;
            go.GetComponent<Rigidbody>().velocity = go.transform.forward * shellSpeed;
        }
	}
}


三、坦克的血量脚本
using UnityEngine;
using UnityEngine.UI;

public class TankHealth : MonoBehaviour {
    public int hp = 100;
    public GameObject tankExplosin;
    public AudioClip tankExplosinAudio;
    public Slider hpSlider;
    private int hpTotal;
	// Use this for initialization
	void Start () {
        hpTotal = hp;
	}
	
	// Update is called once per frame
	void Update () {
		
	}
    void TakeDamage() {
        if (hp <=0) return;
        hp -= Random.Range(10, 20);
        hpSlider.value = (float)hp / hpTotal;
        if (hp <= 0) {
            AudioSource.PlayClipAtPoint(tankExplosinAudio, transform.position);
            GameObject.Instantiate(tankExplosin, transform.position + Vector3.up, transform.rotation);
            GameObject.Destroy(this.gameObject);
        }
    }
}
四、子弹的射击脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Shell : MonoBehaviour {
    public GameObject shellExplosinPrefab;
    public AudioClip shellExplosinAudio;
    // Use this for initialization

    // Update is called once per frame
    private void OnTriggerEnter(Collider collider) {
        AudioSource.PlayClipAtPoint(shellExplosinAudio, transform.position);
        GameObject.Instantiate(shellExplosinPrefab, transform.position, transform.rotation);
        GameObject.Destroy(this.gameObject);
        if (collider.tag == "Tank") {
            collider.SendMessage("TakeDamage");
        }
    }
}
五、摄像机跟随脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FollowTarget : MonoBehaviour {
    public Transform player1;
    public Transform player2;
    private Vector3 offset;
    private Camera camera;
	// Use this for initialization
	void Start () {
        offset = transform.position - (player1.position + player2.position) / 2;
        camera = this.GetComponent<Camera>();
	}
	
	// Update is called once per frame
	void Update () {
        if (player1 == null || player2 == null) return;
        transform.position = (player1.position + player2.position) / 2 + offset;
        float dis = Vector3.Distance(player1.position, player2.position);
        float size = dis * 1.2f;
        camera.orthographicSize = size;
    }
}
六、背景音乐的设置

总结:

看视频学习前我只是简单了解一些Unity的基本操作,所以堪称小白。视频教程短短几小时的时间话费我一天多时间去学习才做出这个简陋版的坦克大战。通过这次学习我了解了一些Unity的操作如脚本的编写,其中变量的调用,控制物体的移动,利用ui表示血量,刚体的作用,摄像头的使用等等。
最后感谢siki老师的视频教程带我走入unity的世界。
 





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值