Unity学习part1

课程为b站【Unity教程】零基础带你从小白到超神

1、脚本执行顺序

unity的脚本执行顺序不像blender的修改器那样按顺序执行,而是系统默认给配置一个值,值越小,执行顺序越靠前(注意,这个顺序是全局生效的)

2、初始化内容

脚本要初始化的内容放在awake函数中,onenable是可以反复调用的。unity中执行顺序是先调用所有脚本的awake完后,在按脚本执行顺序调用其他脚本中的onenable等函数

3、标签与图层 

图层用于碰撞检测,例如将一组物体图层设置为CHARACTER,这样可以让相机在剔除遮罩时,选择CHARACTER图层不进行拍摄,使物体在玩家眼中隐形。可以理解为:标签是开发者给物体分组便于理解的,例如将物体分为敌人,玩家等;而图层是显示分类,给相机使用的

4、预设体

prefab是预设体资产。如果物体变蓝,说明它是与某个预设体相关。物体可以拖到项目栏中生成预设体资产。预设体资产与游戏中物体相当于类与实例的关系,但游戏资产自行更改数值之后,预设体资产的改动就不会影响到游戏体。物体上修改了并且没有将修改应用到预制体上,预制体无法对对应的参数进行修改,即关于此参数,预制体与游戏物体脱钩。

如果需要游戏资产的更改能够影响到预设体,则需要通过打开按钮进行修改(保证游戏物体与预制体参数的关联)

或者通过应用到预制件来进行修改(保证游戏物体与预制体参数的关联)

游戏物体添加组件时,组件会显示一个+号,代表预制体资产里没有。可以通过感叹号右键或者覆盖按钮来应用到预制体组件

 预制体变体与预制体资产之间才是继承关系,即预制体修改,预制体变体随之修改。而预制体变体修改,预制体不会变化。并且预制体变体和预制件之间不存在应用关系

5、vector3

向量vector3可以代表向量、坐标、缩放、旋转

6、四元数与欧拉角的转换

        Vector3 rotate = new Vector3(0,30,0);
        Quaternion quaternion = Quaternion.identity;

        // 欧拉角转换为四元数
        quaternion = Quaternion.Euler(rotate);

        //四元数转换为欧拉角
        rotate = quaternion.eulerAngles;

        //看向一个物体
        quaternion = Quaternion.LookRotation(rotate);

7、DEBUG方法

打印日志

Debug.LogWarning("");
Debug.Log("");
Debug.LogError("");

画一条线

// (起点,终点,颜色)
Debug.DrawLine(Vector3.zero,Vector3.one);

画一条射线,并区分线与射线的区别

8、物体的激活状态

public class test2 : MonoBehaviour
{
    public GameObject cube2;
    // Start is called before the first frame update
    void Start()
    {

        //立方体的名称
        Debug.Log(cube2.name);
        //当前真正的激活状态
        Debug.Log(cube2.activeInHierarchy);
        //当前自身激活状态
        Debug.Log(cube2.activeSelf);
    }

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

public class test2 : MonoBehaviour
{
    public GameObject cube2;

    //获取预设体
    public GameObject preFab;
    // Start is called before the first frame update
    void Start()
    {

        //立方体的名称
        Debug.Log(cube2.name);
        //当前真正的激活状态
        Debug.Log(cube2.activeInHierarchy);
        //当前自身激活状态
        Debug.Log(cube2.activeSelf);

        //获取transform组件
        Transform trans = this.transform;
        Debug.Log(transform.position);

        //获取其他组件
        BoxCollider bc = GetComponent<BoxCollider>();

        //获取当前物体子物体身上的某个组件
        GetComponentInChildren<CapsuleCollider>();

        //获取当前物体父物体身上的某个组件
        GetComponentInParent<BoxCollider>();

        //给当前物体添加一个组件
        gameObject.AddComponent<AudioSource>();

        //给特定物体添加组件
        cube2.AddComponent<AudioSource>();

        //通过游戏物体的名称获取游戏物体
        GameObject test = GameObject.Find("Test");
        Debug.Log(test.name);
        Debug.Log("11111");

        //通过游戏标签获取游戏物体
        GameObject[] test2 = GameObject.FindGameObjectsWithTag("Enemy");
        // 设置激活状态
        test2[0].SetActive(false);
        Debug.Log(test2[0].name);

        //通过预设体资产来实例化一个物体
        Instantiate(preFab);

        //生成的游戏物体可以被当成当前物体的子物体
        Instantiate(preFab, this.transform);

        //实例化一个物体并放置在固定位置并作旋转
        //GameObject go =Instantiate(preFab,Vector3.zero, Quaternion.identity);
        //销毁
        //Destroy(go);
    }

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

9、时间类

public class TimeTest : MonoBehaviour
{
    float timer = 0;
    // Start is called before the first frame update
    void Start()
    {
        //游戏开始到现在所花的时间
        Debug.Log(Time.time);

        //时间缩放值 游戏的加速减速暂停等功能
        Debug.Log(Time.timeScale);

        //固定时间间隔 与FixUpdate()函数相关
        Debug.Log(Time.fixedDeltaTime);

        //上一帧到这一帧所用的游戏时间
        Debug.Log(Time.deltaTime);
    }
    //60帧 1/60 120帧 1/120
    // Update is called once per frame
    void Update()
    {
        //相当于一个计时器,将每一帧帧运行时间相加.作用-->旅行者,请在3秒内开启宝箱
        timer = timer + Time.deltaTime;
        //上一帧到这一帧所用的游戏时间,可用来帧率测试
        //Debug.Log(Time.deltaTime);

        //如果大于十秒
        if (timer > 3)
        {
            Debug.Log("> 3");
        }
     }
}

10、Application类的常用属性方法

public class ApplicationTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //游戏数据文件夹路径(只读,加密压缩)
        Debug.Log(Application.dataPath);

        //持久化文件夹路径,对应不同系统(MAC,WINDOWS,LINUX)。游戏存档存放位置
        Debug.Log(Application.persistentDataPath);

        //StreamingAssets文件夹路径,需手动建立该文件夹。(只读,不加密,放游戏的配置文件或一些不需要加密的二进制文件,所有人可看)
        Debug.Log(Application.streamingAssetsPath);

        //临时文件夹
        Debug.Log(Application.temporaryCachePath);

        //控制是否在后台运行
        Debug.Log(Application.runInBackground);

        //打开url
        Application.OpenURL("https://www.bilibili.com/");

        //退出游戏
        Application.Quit();
    }

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

垃圾window还是默认我工程项目放在appdata下,得想个法子改一下,不然c盘逐渐增加 

11、加载场景(同步)

public class SceneTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //两个类 场景类、场景管理类
        // SceneManager.LoadScene(1);//通过索引
        //SceneManager.LoadScene("MyScene"); //通过名称
        //获取当前场景
        Scene scene = SceneManager.GetActiveScene();
        //场景名称
        Debug.Log(scene.name);

        //场景是否已经被加载
        Debug.Log(scene.isLoaded);

        //场景路径
        Debug.Log(scene.path);

        //场景索引
        Debug.Log(scene.buildIndex);
        //获取场景中所有的根游戏物体
        GameObject[] objects = scene.GetRootGameObjects();
        Debug.Log(objects.Length);


        //场景管理类
        //当前加载的活动场景数量
        Debug.Log(SceneManager.sceneCount);

        //创建新场景,场景同一个时间并不是只能存在一个 是可以同时存在的,可以用于时空关卡切换,关卡叠加
        Scene scene1 = SceneManager.CreateScene("newScene");
        Debug.Log("创建场景");
        //已加载场景个数
        Debug.Log(SceneManager.sceneCount);

        //卸载场景
        SceneManager.UnloadSceneAsync(scene1);
        Debug.Log("卸载场景");
        Debug.Log(SceneManager.sceneCount);

        //加载场景
        //SceneManager.LoadScene("MyScene",LoadSceneMode.Single); //替换形式加载
        SceneManager.LoadScene("MyScene", LoadSceneMode.Additive);//加载出的场景与原本场景融合在一起。场景大的会可能会造成卡顿

    }

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

12、加载场景(异步)

异步 c#通过多线程实现的;而unity还提供了协程的方式来实现异步

public class AsyncTest : MonoBehaviour
{
    AsyncOperation op1;
    // Start is called before the first frame update
    void Start()
    {
        //协程需要使用StartCoroutine方法
        StartCoroutine(loadScene());
        Debug.Log("加载完成");
    }

    //携程方法用来异步加载场景
    IEnumerator loadScene()
    {
        op1 = SceneManager.LoadSceneAsync(1);
        // 加载完场景不要自动跳转,让玩家手动确认再跳转
        op1.allowSceneActivation = false;
        yield return op1; 
    }
    float timer = 0;
    // Update is called once per frame
    void Update()
    {
        //输出加载进度 数值范围为0-0.9
        Debug.Log(op1.progress);
        timer += Time.deltaTime;
        if (timer > 5)
        {
            op1.allowSceneActivation = true;
        }

    }
}

可以看到,MyScene关卡还在加载中

可以看到,因为异步,所以加载完成日志先打印

13 、transform组件

游戏物体的父子关系是由transform组件所关联起来的

public class TransformTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //获取位置
        Debug.Log(transform.position); //在世界中的位置
        Debug.Log(transform.localPosition); //相对于父物体的位置 即面板上的位置

        //获取旋转
        Debug.Log(transform.rotation); //相对于世界的旋转
        Debug.Log(transform.localRotation); //相对于父物体的旋转,四元数
        Debug.Log(transform.eulerAngles); //欧拉角
        Debug.Log(transform.localEulerAngles);

        //获取缩放
        Debug.Log(transform.localScale); //只有相对于父物体的缩放,没有相对于世界的缩放

        //向量,注意 物体旋转时,xyz轴指向也会发生变化。相当于获取红绿蓝三个轴的向量,z轴一般代表前方轴,红色轴代表右手轴,y轴代表上方
        Debug.Log("forward is " + transform.forward);
        Debug.Log("right is " + transform.right);
        Debug.Log("up is " + transform.up);

        //父子关系
        //获取父物体
        //Debug.Log(transform.parent.gameObject);

        //获取子物体个数
        //Debug.Log(transform.childCount);

        //解除与子物体的父子关系
        //transform.DetachChildren();

        //获取子物体
        Transform trans = transform.Find("Child");

        trans = transform.GetChild(0);

        //判断一个物体是不是另一个物体的子物体
        bool res = trans.IsChildOf(transform);
        Debug.Log("IsChildOf is " + res);

        //设置为父物体.这个函数可以让原本不相干的两个物体变成父子关系
        trans.SetParent(transform);
    }

    // Update is called once per frame
    void Update()
    {
        //让一个物体时时刻刻看向另一个物体,举例看向000。即让物体的z轴时刻指向000。可以用于索敌
        //transform.LookAt(Vector3.zero);

        //旋转 按什么轴旋转,每一帧旋转多少度。可用于游戏开发的某种场景物体自旋转。
        //transform.Rotate(Vector3.up, 1);

        //绕某个物体旋转。也可以绑定父物体然后用脚本transform.Rotate让父物体自转
        //绕000点的up轴,每一帧旋转五度(但如果按帧的话 不同设备间帧率有差 可能会导致不同设备上效果不同,可以选用秒单位
        //transform.RotateAround(Vector3.zero, Vector3.up, 5);

        //移动 每一帧向前移动0.1,可用于弹道轨迹
        //transform.Translate(Vector3.forward * 0.0001f);
    }
}

14、基本键鼠操作

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

    // Update is called once per frame
    void Update()
    {
        //键盘鼠标操作需要每一帧都判断
        //鼠标的点击, 0 左键 1 右键 2 滚轮.
        if (Input.GetMouseButtonDown(0))
        {
            //持续按下也只会触发一个buttondown事件
            Debug.Log("按下了鼠标左键");
        }

        //持续按下鼠标。可用于检测连续射击。同一秒可能有多帧,所以同一秒可能输出多条持续的日志
        if(Input.GetMouseButton(0))
        {
            Debug.Log("持续按下鼠标左键");
        }

        //抬起鼠标。
        if (Input.GetMouseButtonUp(0))
        {
            Debug.Log("抬起了鼠标左键");
        }

        //按下键盘按键
        if (Input.GetKeyDown(KeyCode.A)) 
        {
            Debug.Log("按下A");
        }
        //持续按下按键
        if (Input.GetKey(KeyCode.A))
        {
            Debug.Log("持续按下A");
        }
        //抬起键盘按键
        if (Input.GetKeyUp(KeyCode.A)) //也可以用小写字符"a",大写字符"A"会报错
        {
            Debug.Log("松开A");
        }
    }
}

15、虚拟轴

用键盘模拟摇杆.为了跨平台输入监听。不是全部设备都有键盘字母的

只有水平和垂直时虚拟轴,其他是虚拟按键

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

    // Update is called once per frame
    void Update()
    {
        // 获取水平轴,通过输入轴的名称, 轴的名称在项目设置-》输入管理器中定义。按下什么健或鼠标可以在设置中定义
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        //Debug.Log(horizontal + " " + vertical);

        //虚拟按键
        if(Input.GetButtonDown("Jump"))
        {
            Debug.Log("空格");
        }
        if (Input.GetButton("Jump"))
        {
            Debug.Log("持续空格");
        }
        if (Input.GetButtonUp("Jump"))
        {
            Debug.Log("松开空格");
        }
    }
}

16、触摸屏操作

public class TouchTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //开启多点触摸
        Input.multiTouchEnabled = true;
    }

    // Update is called once per frame
    void Update()
    {
        //判断单点触摸
        if(Input.touchCount == 1)
        {
            //触摸对象
            Touch touch = Input.touches[0];
            //触摸位置
            Debug.Log(touch.position);
            //触摸阶段
            switch(touch.phase)
            {
                case TouchPhase.Began:
                    break;
                case TouchPhase.Moved:
                    break;
                case TouchPhase.Stationary:
                    break;
                case TouchPhase.Ended:
                    break;
                case TouchPhase.Canceled:
                    break;
            }
        }

        //判断多点触摸
        if (Input.touchCount == 2)
        {
            Touch touch = Input.touches[0];
            Touch touch1 = Input.touches[1];
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/970707.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Next.js【详解】CSS 样式方案

全局样式 Global CSS 默认已创建&#xff0c;即 src\app\globals.css&#xff0c;可根据需要修改 默认在全局布局中导入 src\app\layout.tsx import "./globals.css";组件样式 CSS Modules 新建文件 src\app\test\styles.module.css .red {color: red;}导入目标页面…

基于SpringBoot+Vue的求职招聘管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在数字化和信息化的时代背景下&#xff0c;求职招聘管理系统作为一种高效的线上服务平台&#xff0c;正逐渐改变着传统的招聘方式。随着互联网的普及和技术的不断进步&#xff0c;求职者与企业之间的信息交互变得越来越频繁和复…

#渗透测试#批量漏洞挖掘#致远互联AnalyticsCloud 分析云 任意文件读取

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

CAS单点登录(第7版)3.安装

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 安装 要求 安装要求 根据配置组件的选择&#xff0c;可能还有其他要求&#xff0c;例如 LDAP 目录、数据库和缓存基础结构。但是&#xff0c;在大多数情况下&#xff0c;对于选择具有明确…

安装 Docker Desktop 修改默认安装目录到指定目录

Docker Desktop安装目录设置 Docker Desktop 默认安装位置 &#xff08;C:\Program Files\Docker\Docker) 是这个 &#xff0c;导致系统盘占用过大&#xff0c;大概2G ; 那么如何安装到其他磁盘呢&#xff1f; 根据docker desktop 官网 Docker Desktop install 我们可以看到&a…

网络安全威胁是什么

1.网络安全威胁的概念 网络安全威胁指网络中对存在缺陷的潜在利用&#xff0c;这些缺陷可能导致信息泄露、系统资源耗尽、非法访问、资源被盗、系统或数据被破坏等。 2.网络安全威胁的类型 物理威胁系统漏洞威胁身份鉴别威胁线缆连接威胁有害程序危险 &#xff08;1&#x…

Flutter_学习记录_动画的简单了解

用AnimationController简单实现如下的效果图&#xff1a; 1. 只用AnimationController实现简单动画 1.1 完整代码案例 import package:flutter/material.dart;class AnimationDemo extends StatefulWidget {const AnimationDemo({super.key});overrideState<AnimationDe…

数据结构与算法之排序算法-选择排序

排序算法是数据结构与算法中最基本的算法之一&#xff0c;其作用就是将一些可以比较大小的数据进行有规律的排序&#xff0c;而想要实现这种排序就拥有很多种方法~ 那么我将通过几篇文章&#xff0c;将排序算法中各种算法细化的&#xff0c;详尽的为大家呈现出来&#xff1a; &…

IOTDB安装部署

IOTDB一般用于工业互联网&#xff0c;至于具体的介绍请自行搜索 1.环境准备 安装前需要保证设备上配有 JDK>1.8 的运行环境&#xff0c;并配置好 JAVA_HOME 环境变量。 设置最大文件打开数为 65535。 关闭防火墙 systemctl stop firewalld.service systemctl disable …

游戏引擎学习第100天

仓库:https://gitee.com/mrxiao_com/2d_game_2 昨天的回顾 今天的工作重点是继续进行反射计算的实现。昨天&#xff0c;我们开始了反射和环境贴图的工作&#xff0c;成功地根据法线显示了反射效果。然而&#xff0c;我们还没有实现反射向量的计算&#xff0c;导致反射交点的代…

分布式 NewSQL 数据库(TiDB)

TiDB 是一个分布式 NewSQL 数据库。它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议&#xff0c;具有数据强一致的高可用特性&#xff0c;是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。 TiDB是 PingCAP公司自主设计、研发的开源分布式关系型数据…

Vue响应式原理实现总结(数据劫持Object.defineProperty/Proxy+发布订阅者设计模式)

Vue的响应式主要分为数据劫持和发布订阅模式。Vue2用的是Object.defineProperty,而Vue3改用Proxy。数据劫持就是在访问或修改对象属性时进行拦截,然后触发相应的更新。发布订阅模式则是用来收集依赖(比如视图更新函数),当数据变化时通知这些依赖执行。 总结一下,关键点包…

以若依移动端版为基础,实现uniapp的flowable流程管理

1.前言 此代码是若依移动端版为基础&#xff0c;实现flowable流程管理&#xff0c;支持H5、APP和微信小程序三端。其中&#xff0c;APP是在安卓在雷电模拟器环境下完成的&#xff0c;其他环境未测试&#xff0c;此文章中所提及的APP均指上述环境。移动端是需要配合若依前后端分…

封装一个sqlite3动态库

作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、项目案例 二…

Qt Creator 5.0.2 (Community)用久了突然变得很卡

目录 1.现象 2.解决方案 1.现象 很久没有用Qt Creator开发项目了&#xff0c;刚刚结束的项目又是用VS2019开发的&#xff1b;这两天刚好有时间去学习一下Qt&#xff0c;刚好要用Qt Creator&#xff0c;结果一打开就没反应&#xff0c;主界面显示出来要好几分钟&#xff0c;最…

[C++]多态详解

目录 一、多态的概念 二、静态的多态 三、动态的多态 3.1多态的定义 3.2虚函数 四、虚函数的重写&#xff08;覆盖&#xff09; 4.1虚函数 4.2三同 4.3两种特殊情况 &#xff08;1&#xff09;协变 &#xff08;2&#xff09;析构函数的重写 五、C11中的final和over…

mac 意外退出移动硬盘后再次插入移动硬盘不显示怎么办

第一步&#xff1a;sudo ps aux | grep fsck 打开mac控制台输入如下指令&#xff0c;我们看到会出现两个进程&#xff0c;看进程是root的这个 sudo ps aux|grep fsck 第二步&#xff1a;杀死进程 在第一步基础上我们知道不显示u盘的进程是&#xff1a;62319&#xff0c;我们…

国家队出手!DeepSeek上线国家超算互联网平台!

目前,国家超算互联网平台已推出 DeepSeek – R1 模型的 1.5B、7B、8B、14B 版本,后续还会在近期更新 32B、70B 等版本。 DeepSeek太火爆了!在这个春节档,直接成了全民热议的话题。 DeepSeek也毫无悬念地干到了全球增速最快的AI应用。这几天,国内的云计算厂家都在支持Dee…

ElasticSearch基础和使用

ElasticSearch基础 1 初识ES相关组件 &#xff08;1&#xff09;Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容。Elasticsearch结合kibana、Logstash、Beats组件 也就是elastic stack&#xff08;ELK&#xff09; 广泛应…

使用Python爬虫实时监控行业新闻案例

目录 背景环境准备请求网页数据解析网页数据定时任务综合代码使用代理IP提升稳定性运行截图与完整代码总结 在互联网时代&#xff0c;新闻的实时性和时效性变得尤为重要。很多行业、技术、商业等领域的新闻都可以为公司或者个人发展提供有价值的信息。如果你有一项需求是要实时…