Unity与C#

PlasticSCM:版本管理工具

工程目录结构

(主要)Assets:资源(存放场景、脚本、模型、素材)
Assets中.meta文件为属性文件,标识文件id,方便unity管理
(主要)Library:系统的一些库
Logs:日志
Packages:导入的一些包
ProjectSettings:工程相关的设置。
Temp:临时的文件夹(可能放一些临时文件与缓存)
UserSettings:也是编辑器设置相关的
SampleScene:游戏场景,通过create=》scene创建游戏场景
packages:包含了一些包和内置插件

unity编辑器的使用

game与Scene窗口可拖动,窗口布局可以通过Layers修改,一般使用Tall
project:一般存放工程资源,这块可调整列数与图标大小,project与Assets文件夹是对应的,创建的C#脚本放在Assets文件夹中。在Edit的Snap Setting能设置设置每次移动的长度,默认是一次移动一米。

快捷键

按住shift:等比例缩放图片
按住option+左键:能拖拽整个画面
选中文件,再点击一下就能修改文件名
页面上选中物体,commond+D为复制物体
unity打开控制台:Window=>General=>Console(command+shift+c)
option + 回车 引入Image所在的命名空间:UnityEngine.UI
按住control再移动物体,能实现单位化移动。可以在Edit => Snap Setting中设置每次移动的多少,默认是一次移动一米。
按下V能实现顶点吸附,再按一下V恢复正常。
control+N:创建新场景
Q、W、E、R、T对应拖动、旋转那几个按钮。
选中摄像机再command+shift+f:让摄像机聚焦到我们的物体

五个面板

Hierarchy: 层级面板,显示当前场景有哪些东西,层级可嵌套、切换。
inspector:检视面板,查看一个游戏物体由哪些“组件”组成。例如Transform、Mesh Renderer、Sphere、Collider这些都是一个组件。
gameObject:游戏物体,场景中的任何东西都叫一个游戏物体,
scene:场景面板,用来显示与编辑当前场景。
game:点击运行按钮,当场景运行起来时,玩家看到的游戏场景样子。不可编辑

render:控制渲染的样子(添加的material就放在这里面)
collider:控制碰撞(空气墙)
unity游戏引擎帮助我们做了碰撞检测,我们只要写游戏的逻辑
Rigidbody组件能给游戏物体添加重力属性。
每个被创建的C#脚本也相当于一个组件,我们在“游戏物体”上通过Add Component添加。
使用组件前要把组件勾选上,不然没有效果。
删除脚本组件时,要把“游戏物体”上对应的脚本文件删除,不然会出现警告。
unity打开控制台:Window=>General=>Console(command+shift+c)

C#代码介绍:
using System.Collections; // 引用系统的类
using System.Collections.Generic;
using UnityEngine;

创建的注意文件名要保持与类名一致,创建一个脚本相当于创建了一个类。初次在unity中创建文件时他们的名称是一致的,二次修改文件名时要保证类名也要同样修改。

Start:开始方法
作用:游戏启动时做一些初始化的工作。

Update:更新方法
作用:控制游戏的一些更新,具体根据功能来定。游戏运行时会一直重复调用Update方法(每一帧调用一次)

游戏物体有的有钢体组件,有些没有,通过代码让他们产生关联.
预制体(Prefabs):相当于一个模板,通过模板可以统一修改物体上一些组件、属性之类的,有模板生成的游戏物体会被统一修改。
在Project模板中修改预制体会同步“孩子”都会修改,在Hierarchy模板中修改“孩子”就不会同步其他“孩子”。但“孩子”也能映射到“母亲”身上通过overrides=>Apply All
制作了一个预制体,然后把预制体删了,那么和预制体关联的游戏物体就会变红,通过GameObject => Break Prefab Instance 取消关联

系统事件:
每个游戏物体都有标签和名字,且可重复。
给预制体添加标签:
在这里插入图片描述
勾上 is Trigger,碰撞器变为触发器,可穿模。
在这里插入图片描述

编辑UI中的text:设置2D,双击canvas,因为canvas是2D的,画布对应game窗口。
设置text位置:
在这里插入图片描述

获取其它游戏物体身上的组件:
在这里插入图片描述
红色小球:
在这里插入图片描述

using System.Collections; 
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SocialPlatforms.Impl;
using UnityEngine.UI; // 引入UI命名空间,不然找不到Text组件

public class Player : MonoBehaviour
{
   
    // Start is called before the first frame update

    // public定义的为公开的属性,可以在Inspector面板中看到,private为私有属性,在面板中不能看到。
    // 通常只设置必要的属性为公开,一般为私有,防止误操作。
   
    public Rigidbody rd; // 定义一个钢体组件,简写为rd,控制小球运动
    public int score;
    public Text scoreText;// 定义一个text组件
    public GameObject winText; // 定义一个游戏物体,因为一会我们要控制游戏物体,目前胜利的游戏物体是禁用的。

    void Start()
    {
   
        // 指定要得到的组件为钢体组件,也可以通过拖拽钢体组件的方式,但一般用代码
        rd = GetComponent<Rigidbody>();
    }


    // Update is called once per frame
    void Update()
    {
   
        // 方向:right、left 前:forword、后:back
        // 方向的方法只监听八个键,四个方向键与W、S、A、D,其他的键不管用
        //Input:与按键相关的监听与处理,GetAxis:轴、Horizontal:水平轴、vertical:垂直轴

        float h = Input.GetAxis("Horizontal"); // GetAxis方法返回一个小于1的小数(-1,1)数字是渐变的,赋值给h
        //Debug.Log(h);
        float v = Input.GetAxis("Vertical");

        // 施加一个向右的力,大小相当于1牛
        //rd.AddForce(Vector3.right);

        // 加速:(1,2,3) * 2 = (2,4,6)

        //rd.AddForce(new Vector3(h, 0, v)*10); // 向右指定一个10N的力

        rd.AddForce(new Vector3(h, 0, v));

        // 左右上下键的按下可设置,通过edit=>Project settings=>Input Manager
    }


    // 碰撞系统事件,unity引擎帮我们检测碰撞,当发生碰撞会调用这个方法,Collision collision:碰撞信息,可知撞到了谁
    //private void OnCollisionEnter(Collision collision) // 发生碰撞时执行一次
    //{
   
    //    //Debug.Log("发生碰撞了");
    //    // collision.collider.tag 通过碰撞组件获取被碰撞物体的标签。
    //    if (collision.gameObject.tag == "Food") { // 通过游戏物体获得标签
    //        Destroy(collision.gameObject);
    //    }
    //}

    //private void OnCollisionStay(Collision collision) // 正在接触一直执行
    //{
   

    //}

    //private void OnCollisionExit(Collision collision) // 碰撞离开时执行一次
    //{
   

    //}

    // 触发检测,当进入某个范围就触发
    private void OnTriggerEnter(Collider other) // 进入触发区域执行一次
    {
   
        if (other.tag == "Food") {
   
            score++;
            Destroy(other.gameObject);
            scoreText.text = "分数:" + score;

            if (score == 9) {
   
                winText.SetActive(true);
            }
        }
        Debug.Log("进入");
    }

    //private void OnTriggerStay(Collider other) // 在触发区域中一直执行
    //{
   
        
    //}

    //private void OnTriggerExit(Collider other) // 离开出发区域执行一次
    //{
   
        
    //}
}

食物:
在这里插入图片描述

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

public class Food : MonoBehaviour
{
   
    // Start is called before the first frame update
    void Start()
    {
   
        
    }

    // Update is called once per frame
    void Update() // Update方法大概一秒执行60次,一次旋转一度,相当于一秒旋转60度
    {
    
        transform.Rotate(Vector3.up); // 设置食物的旋转角度,方向:up(向上),多少度:Vector3(一度)。让它围绕自身上方一度一度的旋转,  
    }
}

相机跟随:
在这里插入图片描述

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

public class FollowTarget : MonoBehaviour
{
   
    // Start is called before the first frame update

    public Transform PlayerTransform;
    private Vector3 offset; // 在类中定义一个变量,类中的方法都可以使用这个变量。
    void Start()
    {
   

        // transform.position : 由于FollowTarget放在相机上,属于相机自己的组件,就直接用transform组件获取相机位置
        // Vector3 offset; 在方法中定义一个变量,只能在这个方法内部使用
        offset = transform.position - PlayerTransform.position;
        
    }

    // Update is called once per frame
    void Update()
    {
   
        transform.position = PlayerTransform.position + offset;
    }
}

定义一个text组件
public Text scoreText;
定义一个游戏物体,因为一会我们要控制游戏物体,目前胜利的游戏物体是禁用的。
public GameObject winText;
碰撞系统事件,unity引擎帮我们检测碰撞,当发生碰撞会调用这个方法,Collision collision:碰撞信息,可知撞到了谁。
private void OnCollisionEnter(Collision collision) 发生碰撞时执行一次
collision.collider.tag 通过碰撞组件获取被碰撞物体的标签。
collision.gameObject.tag == “Food” 通过游戏物体获得标签
OnTriggerEnter 触发检测,当进入某个范围就触发,进入触发区域执行一次
transform.Rotate(Vector3.up); 设置食物的旋转角度,方向:up(向上),多少度:Vector3(一度)。让它围绕自身上方一度一度的旋转
Update方法大概一秒执行60次,一次旋转一度,相当于一秒旋转60度。

UnityAPI常用方法类与组件

public class No1_PrintDebug : MonoBehaviour
{
   
    void Start()
    {
   
        //1.测试
        Calculate();
        //2.检错
        Debug.Log("2+3的计算开始了");
        int a = 1;
        Debug.Log("a赋值完成,具体值是:"+a);
        int b = 3;
        Debug.Log("b赋值完成,具体值是:"+b);
        int num = a + b;
        Debug.Log("2+3="+num);

        Debug.LogWarning("这是一个警告!");
        Debug.LogError("这里有报错!");
    }
    
    private void Calculate()
    {
   
        //Debug.Log("计算");
        Add();
        Subtract();
    }

    private int Add()
    {
   
        //Debug.Log("加法");
        return 1 + 1;
    }

    private int Subtract()
    {
   
        //Debug.Log("减法");
        return 1 - 1;
    }
}

public class TestDebugAndPrintClass:MonoBehaviour
{
    
    public void TestPrint()
    {
   
        print("使用print必须让当前类继承自monobehavior");
    }

    public void TestDebug()
    {
   
        Debug.Log("使用debug再普通类里进行输出");
    }
}

生命周期函数

功能说明:事件函数(生命周期函数),每个游戏物体上的同一钩子函数调用顺序不确定,但可以确定Start一定在Update前被调用,在Awake后执行这种顺序。

public class No2_EventFunction : MonoBehaviour
{
   
    public float attackValue=10000;
    public float currentHP;

    //对变量赋值的顺序(左边最先赋值,右边最后赋值,以此类推):
    //变量声明并直接赋值>检视面板赋值>Awake>OnEnable>Start>外部赋值
    //我们一般对一个对象赋值,或者说想要从外部对一个对象的属性或者成员变量的值
    //进行更改的前提是,这个对象已经有了(意味着start方法已经调用),所以外部赋值
    //会后于Start方法进行调用

    private void Reset()
    {
   
        //1.调用情况:此函数只能在编辑器模式下(不运行)调用。
        //2.调用时间,次数与作用
        //当脚本第一次挂载到对象或者使用了Reset命令之后调用,
        //来初始化脚本的各个属性,Reset最常用于在检视面板中提供良好的默认值。

        Debug.Log("调用了Reset方法");
        Debug.Log("攻击值重置为默认值");
    }

    private void Awake() // 游戏物体或者脚本第一次被激活调用一次
    {
   
        //1.调用情况
        //a.在加载场景时初始化包含脚本的激活状态的GameObject时
        //b.GameObject从非激活转变为激活状态
        //c.在初始化使用Instantiate创建的GameObject之后
        //2.调用时间,次数与作用
        //在脚本实例的生存期内,Unity 仅调用 Awake 一次。脚本的生存期持续到包含它的场景被卸载为止。
        //Unity 调用每个GameObject的Awake的顺序是不确定的,人为干涉(即设计)来保证程序的正确性和稳定性
        // Awake 来代替构造函数进行初始化,在Unity这里,组件的初始化不使用构造函数 

        Debug.Log("调用了Awake方法"); 
        attackValue = 1;
    }

       
    private void OnEnable()  //游戏物体或者脚本每次被激活都会调用一次
    {
   
        //1.调用情况
        //a.游戏物体被激活
        //b.脚本组件被激活
        //2.调用时间,次数与作用
        //重复赋值 变为初始状态
        //Debug.Log("调用了OnEnable方法");

        currentHP = 100;
        Debug.Log("当前血量为:"+currentHP);
        attackValue = 2;
    }

    void Start() //在脚本实例激活时在第一帧的Update前被调用,在Awake后执行,只在首次调用一次
    {
   
        //1.调用情况
        //a.游戏物体被激活
        //b.脚本组件被激活
        //2.调用作用
        //方便控制逻辑的前后调用顺序

        Debug.Log("调用了Start方法");
        attackValue = 3;
    }

    void Update() // 每帧调用,是最常用函数,每秒调用60次左右(根据当前电脑的的性能和状态)
    {
   
        //1.调用情况
        //a.游戏物体被激活
        //b.脚本组件被激活
        //2.调用作用:实时更新数据,接受输入数据

        Debug.Log("调用了Update方法");
    }

    private void LateUpdate()  //在调用所有Update函数后调用,每秒调用60次左右,安排脚本的执行顺序
    {
   
        //1.调用情况
        //a.游戏物体被激活
        //b.脚本组件被激活
        //2.调用作用: 比如摄像机跟随,一定是人物先移动了,摄像机才会跟随

        Debug.Log("调用了LateUpdate方法");
    }

    private void OnDisable() //满足调用情况时即时调用一次,
    {
   
        //1.调用情况
        //a.游戏物体被禁用
        //b.脚本组件被禁用
        //c.游戏物体被销毁
        //2.调用作用:用于一些对象的状态重置,资源回收与清理,OnDisable能做功能,基本上OnEnable也能做

        Debug.Log("调用了OnDisable方法");
    }

    void OnApplicatoinQuit()
    {
   
        //1.调用情况
        //a.在程序退出之前所有的游戏对象都会调用这个函数
        //b.在编辑器中会在用户终止播放模式时调用
        //c.在网页视图关闭时调用
        //2.调用时间,次数与作用
        //满足调用情况时即时调用一次,用于处理一些游戏退出后的逻辑

        Debug.Log("OnApplicationQuit");
    }


    void OnDestroy()
    {
   
        //1.调用情况
        //a.场景或游戏结束
        //b.停止播放模式将终止应用程序
        //c.在网页视图关闭时调用
        //d.当前脚本被移除
        //e.当前脚本挂载到的游戏物体被删除
        //2.调用时间,次数与作用
        //满足调用情况时即时调用一次,用于一些游戏物体的销毁
        
        Debug.Log("OnDestroy");
    }
}

功能说明:用于测试外部调用或者外部复制时的顺序

public class No2_ExternalCall : MonoBehaviour
{
   
    public No2_EventFunction api;  
    // 将ExternalCall挂载到和EventFunction相同的游戏物体上,再将EventFunction的C#脚本拖拽赋值到api引用上。
    // 这样就能在ExternalCall中使用EventFunction中的方法和变量

    void Start()
    {
   
        //通过外部获取组件引用对变量进行赋值
        api.attackValue = -1;
    }

    void 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值