Unity3D 基础入门知识

在大一的暑假花了半个多月学习了Unity3D的基础,这是我总结的一些基础知识,希望和大家分享,也希望大家能够提出自己的看法。

组件开发:强调完成这一个事情的对象身上具有的模块功能

  • 脚本(代码)也是一个组件
    面向过程:强调的完成一件事情的步骤经过,侧重功能的实现步骤
    面向对象:强调的是完成一件事情需要参与的对象以及对象分别负责的功能,侧重类的设计

游戏物体:场景中看得见或看不见的物体都叫做游戏物体

Unity当中游戏物体的基本操作:

  • Q:手形工具 移动场景视图
  • W:平移工具 对游戏物体进行平移操作
  • E:旋转工具 对游戏物体进行旋转
  • R:缩放工具 对游戏物体进行缩放
  • Alt+左键:调整视图视角
  • 右键+wasd:场景漫游快捷键

基础知识:

  • 材质球:用来显示游戏物体的表面细节,可以给它设置一些贴图纹理
    创建方式:到Asset下面右键Creat->Material

  • 本地坐标系与世界坐标系
    世界坐标系:游戏物体在场景当中的位置
    本地坐标系:游戏物体在父物体当中的位置

游戏代码相关操作:

  • 给游戏物体添加tag值,获取tag
    调用transform组件的三种方式
(1)gameObject.GetComponent<Transform>()
(2)gameObject.transform
(3)transform
  • GameObject:游戏对象类
(1)GameObject.Find("name")
(2)GameObject.FindGameObjectWithTag(" ")
  • 获取一个组件:游戏物体.GetCompenent<组件名>()

  • 脚本生命周期

(1)Awake:加载的时候调用一次
(2)OnEnable:激活的时候调用
(3)Stare:脚本运行的时候调用
(4)Update:每帧都调用
(5)LateUpdate:Update执行结束后调用
(6)OnDisable:脚本不激活的时候调用
(7)OnDestroy:脚本销毁的时候调用
  • Time.deltaTime:上一次LateUpdate结束到这次Update开始的时间间隔

  • 监听键盘输入

(1)Input.GetKey(KeyCode.X):某个按键X持续按下的时候触发
(2)Input.GetKeyDown(KeyCode.X):某个按键X按下的时候触发
(3)Input.GetKeyUp(KeyCode.X):某个按键X弹起的时候触发
  • 监听鼠标输入
(1)Input.GetMouseButtonDown ()鼠标按下
(2)Input.GetMouseButton ()鼠标持续点击
(3)Input.GetMouseButtonUp ()鼠标弹起
  • 刚体组件
    RigidBody:用来模仿现实世界的物理效果
    给刚体组件设置一个速度:velocity
    施加爆炸力作用:
//参数1:表示爆炸力大小
//参数2:表示爆炸力施加的点
//参数3:表示爆炸半径
rb.AddExplosionForce (1500, Vector3.zero, 4);
  • 预设体
    生成预设体:将场景的游戏物体拖拽到Asset当中即生成预设体
    根据预设体生成游戏对象:
GameObject.Instantiate(prefab,position,rotattion)
Quaternion.identity:旋转角度都为零
触发器
  • 背景制作
    飞机制作(移动,发射子弹)
    敌机制作
    让敌机有规律的产生(1秒产生1只)
    设计模式(单例设计模式,观察者模式)
    私密了默认构造方法,提供一个对外界可以访问的获取实例的方法
    记分系统
    重新开始游戏,退出游戏
  • 规则:游戏开始的时候10s无敌时间
    阵亡的敌机超过30只子弹的伤害加10
    敌机是一波一波产生的,每一波的间隔时间为5s,每秒产生1只 第一波为5只 第二波为10只 第三波为15只

这是我做的简单小游戏雷霆战机代码:

快打飞机游戏代码

((EnemyController)): 

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

public class EnemyController : MonoBehaviour {
    float speed=2;
    public int HP = 30;
    public int damage = 10;
    public GameObject explosionPrefab;


    // Use this for initialization
    void Start () {
        
    }

    
    // Update is called once per frame
    void Update () {
        transform.position += Vector3.down * speed * Time.deltaTime;
        if (transform.position.y <-6) {
            GameObject.Destroy (gameObject);

        }
        
    }

    void OnTriggerEnter (Collider other){
        
        
            if (other.gameObject.tag == "Player") {
                GameObject.Destroy (gameObject);
                GameController.Instance.score += 10;
                print (GameController.Instance.score);

                GameObject.Instantiate (explosionPrefab, gameObject.transform.position, Quaternion.identity);
                other.gameObject.GetComponent<PlayerController> ().HP -= damage;
                print (other.gameObject.GetComponent<PlayerController> ().HP);
                if (other.gameObject.GetComponent<PlayerController> ().HP <= 0) {
                    GameObject.Destroy (other.gameObject);
                    GameObject.Instantiate (explosionPrefab, other.gameObject.transform.position, Quaternion.identity);
                }
            
            }

    
            
        


    }
    //敌机碰到飞机销毁 玩家飞机扣血 判断剩余血量小于等于0,销毁玩家飞机



}





((GameController.cs)):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameController : MonoBehaviour {
    GameObject zd;
    //敌机预设体
    public GameObject Enemy;
    public int score = 0;
    GameObject player;
    //玩家飞机预设体
    public GameObject playerPrefab;
    #region 单例模式
    //静态变量
    static GameController instance;
    //静态变量实例化
    void Awake(){
        instance = this;
    }
    //对外界提供一个可以访问静态实例的属性或方法
    public static GameController Instance{
        get{
            return instance;
        }
    }
    #endregion

    // Use this for initialization
    void Start () {
        player=GameObject.Find("Player");
        
    }
    
    // Update is called once per frame
    void Update () {
        if (player != null) {
            GameRule ();

        }
    }


    float timer=0;
    float timer2=0;
    //游戏规则:0.5秒产生1只敌机
    void GameRule(){
        
        

        
        timer += Time.deltaTime;
        timer2 += Time.deltaTime;
        if (timer <= 5) {
            if (timer2 >=1f) {
                timer2 = 0;
                
                float randomX = Random.Range (-4.5f, 4.5f);
                //敌机位置
                Vector3 enemyPos = new Vector3 (randomX, 6, -1);
                GameObject.Instantiate (Enemy, enemyPos, Enemy.transform.rotation);

            }
        }
        if (timer > 5 && timer <= 10) {
            if (timer2 >=0.5f) {
                timer2=0;
                
                float randomX = Random.Range (-4.5f, 4.5f);
                //敌机位置
                Vector3 enemyPos = new Vector3 (randomX, 6, -1);
                GameObject.Instantiate (Enemy, enemyPos, Enemy.transform.rotation);

            }
        }
        if (timer > 10&&timer<20) {
            if (timer2 >= 0.2f) {
                timer2=0;
                float randomX = Random.Range (-4.5f, 4.5f);
                //敌机位置
                Vector3 enemyPos = new Vector3 (randomX, 6, -1);
                GameObject.Instantiate (Enemy, enemyPos, Enemy.transform.rotation);

            }
        }
        if (timer > 20&&timer<40) {
            if (timer2 >=0.05f) {
                timer2=0;
                float randomX = Random.Range (-4.5f, 4.5f);
                //敌机位置
                Vector3 enemyPos = new Vector3 (randomX, 6, -1);
                GameObject.Instantiate (Enemy, enemyPos, Enemy.transform.rotation);

            }
        }
        if (timer > 40) {
            if (timer2 >=0.01f) {
                timer2=0;
                float randomX = Random.Range (-4.5f, 4.5f);
                //敌机位置
                Vector3 enemyPos = new Vector3 (randomX, 6, -1);
                GameObject.Instantiate (Enemy, enemyPos, Enemy.transform.rotation);

            }
        }


        
    }
    //持续调用 用于刷新界面UI
    void OnGUI(){
        //显示分数:
        Rect scoreRect=new Rect(Screen.width-130,50,200,80);
        GUI.Label (scoreRect, "Score:" + score);
        //退出按钮
        Rect QuitBtnRect=new Rect(20,50,100,30);
        if (GUI.Button (QuitBtnRect, "退出游戏")) {
            Application.Quit ();
        }
            
                //退出游戏
        //中间文本 (200*60)字体大小25



        if (player == null) {
            //中间文本 (200*60)字体大小25
            Rect textRect = new Rect (Screen.width / 2 - 100, Screen.height / 2 - 30, 200, 60);
            //文本样式

            GUIStyle textStyle = new GUIStyle ();
            textStyle.normal.textColor = Color.white;
            textStyle.fontSize = 30;
            textStyle.alignment = TextAnchor.MiddleCenter;

                
            if (score <=200) {
                GUI.Label (textRect, "hh 笑死:" + score,textStyle);
            }
            if (score >= 200 && score < 500) {
                GUI.Label (textRect, "小垃圾:" + score,textStyle);
            }
            if (score >= 500 && score <1000) {
                GUI.Label (textRect, "一般般喽:" + score,textStyle);
            }
            if (score >=1000 && score < 1500) {
                GUI.Label (textRect, "再多一点就超过你哥了:" + score,textStyle);
            }
            if (score >=1500) {
                GUI.Label (textRect, "真的能到这??老司机,手速六 :" + score,textStyle);
            }
            Rect ReStartBtnRect = new Rect (Screen.width / 2 - 50, textRect.y + 70, 100, 20);
            if (GUI.Button (ReStartBtnRect, "ReStart!!")) {
                //点击了重新开始按钮:生成玩家飞机 分数清零
                Vector3 playerPos=new Vector3(0,-4.5f,-1);
                player=GameObject.Instantiate (playerPrefab, playerPos, playerPrefab.transform.rotation);
                score = 0;
                timer = 0;
                timer2 = 0;

            }
                

        }

        
        

        
    }
}





((PlayerController.cs)):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour {
    AudioSource shootAS;
    float speed=8;
    //子弹预设体
    public GameObject bulletPrefab;
    public Transform bulletTransform;
    public int HP=30;
    //控制飞机左右上下移动 速度8



    // Use this for initialization

    void Start () {
        
        //获取射击的音频片段
        shootAS = gameObject.GetComponent<AudioSource> ();
        
    }
    
    // Update is called once per frame
    void Update () {
        GameRule ();
        Mobe ();
        Shoot ();
        
    }
    float timer=0;

    //游戏规则:前10s无敌
    void GameRule(){
        timer += Time.deltaTime;
        if (timer <5f) {

            HP = 30;

        }
    }
    void OnGUI(){
        if (timer < 5f) {
            Rect textRect = new Rect (Screen.width / 2 - 100, Screen.height / 2 - 30, 200, 60);
            //文本样式

            GUIStyle textStyle = new GUIStyle ();
            textStyle.normal.textColor = Color.blue;
            textStyle.fontSize = 30;
            textStyle.alignment = TextAnchor.MiddleCenter;
            GUI.Label (textRect, "无敌时间" + (5 - (int)timer), textStyle);
        }

    }
    void Mobe(){
        float vertical = Input.GetAxis ("Vertical");
        float Horizontal = Input.GetAxis ("Horizontal");
        Vector3 direction = new Vector3 (Horizontal, vertical, 0);
        transform.position += direction * speed * Time.deltaTime;
        //transform.Translate (Vector3.back * speed * vertical * Time.deltaTime);
        //transform.Translate (Vector3.left* speed * Horizontal * Time.deltaTime);
        //限定飞机位置x(-4.5,4.5)   y(-4.5,3)

        Vector3 tempPos = transform.position;
        tempPos.x = Mathf.Clamp (tempPos.x, -4.5f, 4.5f);
        tempPos.y = Mathf.Clamp (tempPos.y, -4.5f, 4f);
        transform.position = tempPos;
        /*if(transform.position.x<-4.5f){
            Vector3 tempPos = new Vector3 (-4.5f, transform.position.y, transform.position.z);
            transform.position=tempPos;
        }
        if(transform.position.x>4.5f){
            Vector3 tempPos2 = new Vector3 (4.5f, transform.position.y, transform.position.z);
            transform.position= tempPos2;
        }
        if(transform.position.y<-4.5f){
            Vector3 tempPos3 = new Vector3 ( transform.position.x, -4.5f
                ,transform.position.z);
            transform.position=tempPos3;
        }
        if(transform.position.y>4f){
            Vector3 tempPos4 = new Vector3 (transform.position.x,4f, transform.position.z);
            transform.position=tempPos4;
        }*/
    }
    void Shoot(){
        if (Input.GetKeyDown(KeyCode.J)) {
            //使用音频组件播放音频片段
            shootAS.Play();
            GameObject.Instantiate (bulletPrefab, bulletTransform.position, bulletPrefab.transform.rotation);
            
        }

        
    }
        


}






((RocketController.cs)): 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RocketController : MonoBehaviour {
    //让子弹向y正飞行 速度13
    float speed=15;
    public int damage = 10;
    public GameObject explosionPrefab;




    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        transform.position += Vector3.up * speed * Time.deltaTime;
        //超出一定范围后立即销毁
        if (transform.position.y > 6) {
            GameObject.Destroy (gameObject);
        }


        
    }
    void OnTriggerEnter(Collider other){
        GameObject.Destroy(gameObject);
        GameObject.Instantiate (explosionPrefab, transform.position, Quaternion.identity);

        other.gameObject.GetComponent<EnemyController> ().HP-=damage;
        if (other.gameObject.GetComponent<EnemyController> ().HP <= 0) {
            GameObject.Destroy (other.gameObject);
            //累加分数
            GameController.Instance.score+=10;
            print (GameController.Instance.score);

            GameObject.Instantiate (explosionPrefab, other.transform.position, Quaternion.identity);
        }

    }
}







((StarBGController.cs)):

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

public class StarBGController : MonoBehaviour {
    //控制背景往y轴负方向移动,速度为1
    //当第一个看不见时放置到最上面去
    float moveSpeed=1;


    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        transform.position += Vector3.down * moveSpeed * Time.deltaTime;
        if (transform.position.y <= -10) {
            Vector3 newPos = new Vector3 (transform.position.x, 9, transform.position.z);
            transform.position = newPos;
        }
        
    }
}






希望大家多多指教。

相关专业知识推荐

  • 博客:简书
  • github:全球最大的代码托管仓库
  • 拉勾网 薪资 boss直聘
  • 编程语言排行榜
  • 前端:ios android h5 Unity3d 开发语言 UI 网络 线程 全栈工程师
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容