Unity学习part2

为bilibili教程【【Unity教程】零基础带你从小白到超神】 https://www.bilibili.com/video/BV1gQ4y1e7SS/?p=50&share_source=copy_web&vd_source=6e7a3cbb802eb986578ad26fae1eeaab的笔记

1、灯光的使用

定向光模拟太阳,是平行光。旋转定向光,光线角度会变化

阴影类型:无阴影/硬阴影(性能消耗小)/软阴影(性能消耗大)

剪影:类似选择太阳光斑,选择什么图片,就投射怎样的阴影形状

剔除遮罩:选择是否为某一layer物体打光,例如可以不用给ui层物体打光

聚光相当于一个手电筒

点光源相当于一个灯泡,注意灯光光线也会衰减,要照亮可以增加强度或者扩大照射面积

以上三种灯光都有模式可以选择 混合/实时/已烘焙。混合 = 实时+ 烘焙。实时为游戏中实时计算的灯光,耗性能。烘焙指预先计算的,不会在运行中变化的信息。贴上烘焙灯光信息贴图之后,可以将不需要的灯光源删除

区域(仅烘焙),从平面发射出来的平行光,是面光。(烘焙把游戏纹理和光照计算一遍,然后保存下来,等用的时候直接调用,不需要玩家的设备实时去算 优化性能用的- 弹幕云)

烘焙方法:窗口-》渲染-》生成照明

可以看到,将灯光删除之后,烘焙的灯光信息依旧表现

2、相机

相机的“深度”值越高,越优先显示。当游戏物体中有两个相机时,可更改深度来更改显示优先级 

清除标志一般是将两个相机所拍摄物体相容(fps持枪视角枪身看起来永远不穿模就是这么做的-弹幕)。例如相机main 清除标志-天空盒,相机 addicitive 清除标志 -- 仅深度。可以通过清除标志仅深度+深度优先级来使多个相机的内容一起显示

可实现功能 游戏ui或者比赛场地/演播室/观众席三个画面同框(弹幕)、小地图(弹幕)

fov轴和视野搭配使用。剪裁平面的远、近是指相机的近平面和远平面

viewport矩形里面的值x,y,w,h是比例。x,y代表从界面的百分之几开始,w,h则代表表示的画面宽高。可以用于实现画中画或者双人成行的分屏显示或者玩具熊的午夜后宫中的监控器显示

目标纹理配置之后,目标显示就会被替代。并且渲染器纹理可以拉到游戏物体上,可以用来实现游戏玩家在游戏里的电视机上看到自己被监控的画面,3d停车场游戏中的后视镜画面(弹幕),实现在游戏里玩游戏

3、音频

增加audio source组件

唤醒时播放 - 程序运行时自动播放

音频的最小声音和最大声音可以结合起来做脚步声和收音机的音效

public class AudioTest : MonoBehaviour
{
    //AudioClip
    public AudioClip music;
    public AudioClip se;

    //播放器组件
    private AudioSource player;
    // Start is called before the first frame update
    void Start()
    {
        player = GetComponent<AudioSource>();
        //设定播放的音频片段
        player.clip = music;
        //循环
        player.loop = true;
        //音量
        player.volume = 0.5f;
        //播放
        player.Play();
    }

    // Update is called once per frame
    void Update()
    {
        //按空格切换声音的播放和暂停
        if(Input.GetKeyDown(KeyCode.Space)) 
        {
            //如果当前正在播放声音
            if (player.isPlaying)
            {
                //停止播放
                player.Pause();
                //player.Stop();
            }
            else
            {
                //继续
                player.UnPause();
                //开始播放
                //player.Play();
            }
        }

        //按鼠标左键播放声音
        if (Input.GetMouseButtonDown(0)) 
        { 
            player.PlayOneShot(se);
        }
    }
}

4、视频

可以通过vedioplayer组件+渲染器纹理播放. plane+渲染器纹理播放可实现游戏中的广告大屏播放效果

或者ui ->原始图像,通过纹理播放

public class vediotest : MonoBehaviour
{
    private VideoPlayer player;
    // Start is called before the first frame update
    void Start()
    {
        player = GetComponent<VideoPlayer>();
    }

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

5、角色控制器的使用

public class Playercontrol : MonoBehaviour
{
    private CharacterController player;
    // Start is called before the first frame update
    void Start()
    {
        player = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
        //水平轴
        float horizontal = Input.GetAxis("Horizontal");
        //垂直轴
        float vertical = Input.GetAxis("Vertical");
        //创建成一个方向向量
        Vector3 dir = new Vector3(horizontal,0, vertical);
        Debug.DrawRay(transform.position, dir, Color.red);

        //朝向该方向移动
        player.SimpleMove(dir);
    }
}

6、重力

添加rigidbody刚体组件。阻力是运动时受到的阻力,角阻力是旋转时受到的阻力。碰撞检测选择离散的,可能会导致物体没有检测到它们互相进行了碰撞。可以选择地面持续检测,子弹连续动态。“是运动学的”勾选之后,物体不再受物理规律影响。冻结位置可以使物体在某一轴向上不移动

7、检测碰撞

碰撞半径是绿色的线框

public class FireTest : MonoBehaviour
{
    //创建一个爆炸预设体
    public GameObject prefab;
    // Start is called before the first frame update
    void Start()
    {
        
    }

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

    //监听发生碰撞
    private void OnCollisionEnter(Collision collision)
    {
        //创建一个爆炸物体
        Instantiate(prefab,transform.position,Quaternion.identity);
        //销毁自身
        Destroy(gameObject);
        //获取碰撞到的物体
        Debug.Log(collision.gameObject.name);
    }

    //持续碰撞中
    private void OnCollisionStay(Collision collision)
    {
        
    }

    //结束碰撞
    private void OnCollisionExit(Collision collision)
    {
        
    }
}
public class Expositest : MonoBehaviour
{
    float timer = 0;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        timer += Time.deltaTime;
        if(timer >=1)
        {
            Destroy(gameObject);
        }
    }
}

//销毁爆炸效果,销毁脚本应搭载在爆炸效果预制件上,而不是火焰效果预制件上

8、触发

让相机与场景视野保持一致 :选中相机,游戏对象-》对齐视图

触发与碰撞区别:碰撞是两个物体都有碰撞属性,触发是一个物体有碰撞属性,另一个物体有触发属性

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

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

    //碰撞获取的是发生碰撞的信息体
    private void OnCollisionEnter(Collision collision)
    {
        
    }
    //参数是进入触发的碰撞器
    private void OnTriggerEnter(Collider other)
    {
        GameObject door = GameObject.Find("DOOR");
        if (door != null) { 
            door.SetActive(false);
        }
    }

    private void OnTriggerStay(Collider other)
    {
        
    }

    private void OnTriggerExit(Collider other)
    {
        
    }
}

9、物理关节

例如:门与墙之间的连接合页(物理关节)

hinge joint组件中anchor的数值是按比例算的 物体原点算000,修改anchor可修改joint位置。修改“轴”可修改joint的朝向

要使门变成自动门,可以使用motor,给与一个初始力和速度

运动学刚体是指不受外力或碰撞影响的刚体。它不会受到物理引擎的模拟,而是通过直接设置位置和旋转来控制其运动。这意味着你可以手动控制运动学刚体的位置和旋转,而不会受到物理引擎的影响。(弹幕)

spring joint ,弹簧组件。不动的物体要设置为运动学的

固定关节组件,fixed joint,类似于胶水作用,可设置断开力矩,受到超过这个力的时候,两个物体会分离

10、物理材质

摩擦组合是指两个附有物理材质的物体接触后,他们之间的摩擦力该如何计算。例如冰和地面间的摩擦力。而反弹合并,指两个都有反弹力的物体间接触后,它们间的弹力该如何组合

11、射线检测

要把相机的tag改为Main camera。

多检测效果--比如FPS一发子弹可能打中两个人,两个人都掉血;比如说穿透子弹的效果;比如地面上有一块被伞或树挡住,单检测碰到树叶就停下了,玩家无法就走到树下面(弹幕)

public class RayTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //方式一
        //Ray ray = new Ray(Vector3.zero, Vector3.up);

        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            //方式2 按下鼠标左键发射射线
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            //申明一个碰撞信息类
            RaycastHit hit;

            //碰撞检测
            bool res = Physics.Raycast(ray, out hit);

            //如果碰撞到的情况下,hit就有内容了
            if (res == true) 
            {
                Debug.Log(hit.point);
                transform.position = hit.point;
            }

            //多检测,参数可以有检测距离,只检测某一图层
            //RaycastHit[] hits = Physics.RaycastAll(ray,100,1<<10);
        }
    }
}
//实现鼠标点到哪,物体移动到哪

12、粒子系统的基本应用

"预热“--去除掉粒子系统成长的从无到有的第一个周期

”模拟空间“-- 局部,生成的粒子还跟随父物体的移动而移动。而世界,是生成的物体不跟随父物体的移动而移动,只有即将生成的粒子会受移动的影响

13、线段渲染器

线段渲染器(line render组件)所画出的图形,会随着旋转视角的改变而展示更全面.可以用于战旗游戏的移动路径(弹幕)。

public class LineTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //设定线段的位置
        //获取线段渲染器
        LineRenderer lineRenderer = GetComponent<LineRenderer>();
        lineRenderer.positionCount = 3;
        lineRenderer.SetPosition(0, Vector3.zero);
        lineRenderer.SetPosition(0, Vector3.one);
        lineRenderer.SetPosition(0, Vector3.down);
    }

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

此部分代码与位置功能相同

运行后

可以用拖尾(trail render)实现(飞船的引擎拖尾,挥剑时的刀光)。游戏中物体移动时生成拖尾

自动销毁-- 拖尾完成后,挂载拖尾渲染器的物体会跟随一起消失

可实现水果忍者类似的效果

14、动画

animations组件(旧版动画组件),culling type优化方式

窗口-》动画—》动画,打开动画面板 

可以通过动画窗口的添加属性按钮,添加组件的属性进行k帧;或者通过录制按钮进行录制。

可以对动画资产选择贴图拼接属性

在动画窗口还可以选择曲线来可视化动画关键帧的位置变化

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

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            GetComponent<Animation>().Play("right");
        }
    }
}

 animator组件(新版)和动画器控制器组合使用,并且新版的动画和旧版的动画属性也不一致

public class AnimatorTest : MonoBehaviour
{
    private Animator animator;
    // Start is called before the first frame update
    void Start()
    {
        //获取动画器组件
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0)) 
        {
            animator.Play("down");
        }
    }
}
//按下鼠标左键播放动画改变

15、动画间的过渡

动画间的过渡和ue的动画状态机差不多,用各种参数和函数控制触发

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

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.F)) 
        {
            //触发pickup参数
            GetComponent<Animator>().SetTrigger("pickup");
        }
    }
}

但这个代码会发现按F之后会有延迟才执行pickup,这是因为有退出时间(动作后摇,魂游所爱),可以取消勾选退出时间来取消后摇

16、人物的移动及播放动画

public class PlayerMoveController : MonoBehaviour
{
    private Animator animator;
    // Start is called before the first frame update
    void Start()
    {
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        //水平轴
        float horizontal = Input.GetAxis("Horizontal");
        //垂直轴
        float vertical = Input.GetAxis("Vertical");
        //向量
        Vector3 dir = new Vector3(horizontal,0, vertical);

        //当用户按下方向键
        if (dir != Vector3.zero)
        {
            //面向向量
            transform.rotation = Quaternion.LookRotation(dir);
            //播放跑步动画
            animator.SetBool("isRun", true);
            //朝向前方移动
            transform.Translate(Vector3.forward * 2 * Time.deltaTime);
        }
        else {
            //播放站立动画
            animator.SetBool("isRun", false);
        }
    }
}

如果还觉得有过渡的效果不好,可以将过渡持续时间改为0,但是这样会导致动作切换的生硬。适当的过渡有更好的演出效果

17、剪辑的常用设置

rig中如果为旧版,就要选用animation组件(旧版组件) 

循环匹配为动画的第一帧和最后一帧是否能顺利流畅的匹配起来,也就是循环时前一周期的最后一帧和这一周期的第一帧连起来时看起来不会有很大的突兀。循环匹配为黄色时代表第一帧和最后一帧不能顺利流畅的匹配

根变换旋转、根变换位置等查看其他资料或者查看这套教程lesson49 

18、曲线和帧事件

曲线可以在动画中添加设置,在脚本中被使用。使用场景可以是蓄力拳,随按键时间的增加,在某一时刻用获取到的数值来判断特效的放出效果强弱

而帧事件可以实现诸如人物在水面上脚落地时的涟漪,左脚落地时产生火花效果,左右脚落地时产生脚步音效,或者fps游戏时换弹时每次都弹出弹壳,打枪时也会弹出弹壳

public class PlayerMoveController : MonoBehaviour
{
    private Animator animator;
    // Start is called before the first frame update
    void Start()
    {
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        //水平轴
        float horizontal = Input.GetAxis("Horizontal");
        //垂直轴
        float vertical = Input.GetAxis("Vertical");
        //向量
        Vector3 dir = new Vector3(horizontal,0, vertical);

        //当用户按下方向键
        if (dir != Vector3.zero)
        {
            //面向向量
            transform.rotation = Quaternion.LookRotation(dir);
            //播放跑步动画
            animator.SetBool("isRun", true);
            //朝向前方移动
            transform.Translate(Vector3.forward * 2 * Time.deltaTime);
        }
        else {
            //播放站立动画
            animator.SetBool("isRun", false);
        }

        //随时获取test参数并打印出来
        //Debug.Log(animator.GetFloat("Test"));
    }

    void leftfoot()
    {
        //可以在这边播放音效或者添加特效
        Debug.Log("左脚");
    }

    void rightfoot()
    {
        Debug.Log("右脚");
    }
}

19、混合动画(混合状态)

跟虚幻的混合空间相同,自然的形成不同动画间的过渡,例如从走到跑

automate thresholds取消勾选和勾选能改变threshold的值 

blend tree还可以套娃

20、动画层 

any state状态,是指无论任何状态,都能通过某一条件转为跑步状态。例如,人物有一百多个动画,就可以通过只创建这一个过渡而不是创建一百多条过渡条件过渡到跑步。

状态机中还可以创建子状态机,实现嵌套。例如,可以拿刀的的动画全放在一类状态机里,拿枪的动画可以放在另一类子状态机中。分类,方便整理,不用创建多个动画器控制器(弹幕)

 21、动画分层

动画分层如果不搭配遮罩使用,会变成平移着挥手,脚不动这种情况

但搭配遮罩,就可以根据骨骼ik来选择播放哪一层动画.上面动画分类可以是新增子状态机,但也可以是通过动画分层来实现的,例如将拿枪的放到一层,拿刀的放到另一层,这样可以通过脚本改变权重,来改变播放动画

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

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

相关文章

Vue 实现主题切换(明暗)

项目地址&#xff1a;https://gitee.com/abcdfdewrw/vue3_xiaohongshu_project 效果展示&#xff1a; 步骤1&#xff1a;定义明暗scss样式 // 浅色模式 html[data-theme"light"]:root {--header-height: 72px;--color-border-bottom: #eef2f9;--color-primary-lab…

rabbitmq五种模式的总结——附java-se实现(详细)

rabbitmq五种模式的总结 完整项目地址&#xff1a;https://github.com/9lucifer/rabbitmq4j-learning 一、简单模式 &#xff08;一&#xff09;简单模式概述 RabbitMQ 的简单模式是最基础的消息队列模式&#xff0c;包含以下两个角色&#xff1a; 生产者&#xff1a;负责发…

数据结构 day02

3. 线性表 3.1. 顺序表 3.1.3. 顺序表编程实现 操作&#xff1a;增删改查 .h 文件 #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #define N 10 typedef struct seqlist {int data[N];int last; //代表数组中最后一个有效元素的下标 } seqlist_t;//1.创建一个空的顺序表 seq…

STM32的HAL库开发---ADC

一、ADC简介 1、ADC&#xff0c;全称&#xff1a;Analog-to-Digital Converter&#xff0c;指模拟/数字转换器 把一些传感器的物理量转换成电压&#xff0c;使用ADC采集电压&#xff0c;然后转换成数字量&#xff0c;经过单片机处理&#xff0c;进行控制和显示。 2、常见的AD…

25/2/16 <算法笔记> DirectPose

DirectPose 是一种直接从图像中预测物体的 6DoF&#xff08;位姿&#xff1a;6 Degrees of Freedom&#xff09;姿态 的方法&#xff0c;包括平移和平面旋转。它在目标检测、机器人视觉、增强现实&#xff08;AR&#xff09;和自动驾驶等领域中具有广泛应用。相比于传统的位姿估…

企业级API集成方案:基于阿里云函数计算调用DeepSeek全解析

解决方案链接&#xff1a;https://www.aliyun.com/solution/tech-solution/deepseek-r1-for-platforms?utm_contentg_1000401616 何为DeepSeek R1 DeepSeek R1模型有诸多技术优势。高效架构设计使其能更高效提取特征&#xff0c;减少冗余计算&#xff0c;提升数据处理速度、…

137,【4】 buuctf web [SCTF2019]Flag Shop

进入靶场 都点击看看 发现点击work会增加&#xffe5; 但肯定不能一直点下去 抓包看看 这看起来是一个 JWT&#xff08;JSON Web Token&#xff09;字符串。JWT 通常由三部分组成&#xff0c;通过点&#xff08;.&#xff09;分隔&#xff0c;分别是头部&#xff08;Header&…

ThinkPHP8视图赋值与渲染

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 在控制器操作中&#xff0c;使用view函数可以传入视图…

渗透利器:YAKIT 工具-基础实战教程.

YAKIT 工具-基础实战教程. YAKIT&#xff08;Yak Integrated Toolkit&#xff09;是一款基于Yak语言开发的集成化网络安全单兵工具&#xff0c;旨在覆盖渗透测试全流程&#xff0c;提供从信息收集、漏洞扫描到攻击实施的自动化支持。其核心目标是通过GUI界面降低Yak语言的使用…

Fiori APP配置中的Semantic object 小bug

在配置自开发程序的Fiori Tile时&#xff0c;需要填入Semantic Object。正常来说&#xff0c;是需要通过事务代码/N/UI2/SEMOBJ来提前新建的。 但是在S4 2022中&#xff0c;似乎存在一个bug&#xff0c;即无需新建也能输入自定义的Semantic Object。 如下&#xff0c;当我们任…

shell——分支语句

文章目录 基本语法常用判断条件(1)两个整数之间比较&#xff08;2&#xff09;按照文件权限进行判断&#xff08;3&#xff09;按照文件类型进行判断&#xff08;4&#xff09;多条件判断&#xff08;&& 表示前一条命令执行成功时&#xff0c;才执行后一条命令&#xf…

Ubuntu 连接 air pods

&#xff11;&#xff0e; sudo vim /etc/bluetooth/main.conf , 修改蓝牙模式为blder &#xff12;&#xff0e;sudo /etc/init.d/bluetooth restart, 重启蓝牙&#xff0c;即可连接成功

机器学习:k近邻

所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com)&#xff0c;欢迎查看。 K 邻近算法&#xff08;K-Nearest Neighbors&#xff0c;简称 KNN&#xff09;是一种经典的机器学习算法&#xff0c;主要用于分类和回归任务…

低空经济:开启未来空中生活的全新蓝海

引言 随着科技的进步&#xff0c;我们不再仅仅依赖地面交通和传统物流。你是否曾幻想过&#xff0c;未来的某一天&#xff0c;快递、外卖可以像魔法一样直接从空中送到你手中&#xff1f;或者&#xff0c;你能乘坐小型飞行器&#xff0c;快速穿梭于城市之间&#xff0c;告别拥堵…

DeepSeek核心算法解析:如何打造比肩ChatGPT的国产大模型

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列一DeepSeek核心算法解析&#xff1a;如何…

苍穹外卖day4 redis相关简单知识 店铺营业状态设置

内存存储 键值对 key-value 一般用于处理突发性大量请求数据操作&#xff08;暂时浅显理解&#xff09; 读写速度极快&#xff0c;常用于缓存数据&#xff0c;减少对数据库的访问压力&#xff0c;提高系统性能。例如&#xff0c;可以缓存用户会话、商品信息、页面数据 设置默…

API 接口自动化

HTTP协议 - 白月黑羽 HTTP协议简介 如果客户端是浏览器&#xff0c;如何在chrome浏览器中查看 请求和响应的HTTP消息&#xff1f;按f12-》network 清除当前信息 响应的消息体在Response里看 点preview&#xff0c;可以看响应的消息体展开的格式 HTTP请求消息 请求头 reques…

Oracle序列(基础操作)

序列概念 序列是用于生成唯一、连续序号的对象。 序列可以是升序的&#xff0c;也可以是降序的。 使用CREATE SEQUENCE语句创建序列。 start with 1 指定第一个序号从1开始 increment by 1 指定序号之间的间隔为1 increment by -1 降序1000 999 998这样 maxvalue 2000 表…

【pytorch】weight_norm和spectral_norm

apply_parametrization_norm 和spectral_norm是 PyTorch 中用于对模型参数进行规范化的方法&#xff0c;但它们在实现和使用上有显著的区别。以下是它们的主要区别和对比&#xff1a; 实现方式 weight_norm&#xff1a; weight_norm 是一种参数重参数化技术&#xff0c;将权…

unity学习44:学习Animator 的一个动作捕捉网站,实测好用

目录 1 动作捕捉网站 2 注册和下载 3 比如首页的内容&#xff0c;可以直接下载为fbx模型文件 4 上传并修改 5 在 unity里使用 5.1 下载的fbx文件直接拖入到unity 5.2 动画修改 5.3 游戏里播放 1 动作捕捉网站 一个动作捕捉网站 AI神器集合网站 千面视频动捕 | AI神器…