当前位置:   article > 正文

unity学习笔记(学习使用)_unity软件笔记

unity软件笔记

基本知识:

认识unity界面

  1. 添加一个正方体
  2. 窗口布局
  3. 层级窗口
  4. 检查窗口
  5. 项目资源
  6. Console
  1. 重置布局
  2. 改变字体大小
  1. 添加游戏物体
  1. 放大物体
  2. 删除;重命名;复制 (两种操作方法)
  3. 移动物体
  1. 3D视图(各种视图之间的转换)
  1.   基本组件
  2.   旋转视图
  3.   缩放视图
  4.   平视视图
  5.   导航器(恢复方向,X,Y,Z)
  1. 视图中心
  1. 将物体放在视野中心(一般添加新物体,都会放在视野中心)

5.  多选 复制 聚焦 激活 对齐

  (1)多选(建议在任务框里选)

  (2)聚焦 F键(或者双击列表上某个物体)

  (3)对齐 正交视图下对齐

认识理解一些名词:

Rigidbody:

物理系统的核心组件,它负责控制游戏对象在物理世界中的运动。通过Rigidbody,你可以设置游戏对象的质量、阻力、是否受重力影响等物理属性,并可以通过代码或Unity编辑器来控制它的运动。

1._rigidbody = this.gameObject.GetComponent<Rigidbody>();

1)简单来说就是用_rigidbody实例化this.gameObjectRigidbody

所以_rigidbodyRigidbody类下的属性与方法

2)具体:

  1. 获取当前游戏对象(this.gameObject)上的Rigidbody组件,并将其引用赋值给_rigidbody变量
  2. this.gameObject指的是当前脚本所附加的游戏对象。
  3. GetComponent<Rigidbody>()是一个方法,用于从该游戏对象上获取Rigidbody类型的组件。

2._rigidbody.MovePosition(this.transform.position+V_Value*this.transform.forward * speed * Time.deltaTime);(这个是放在Update方法里,每帧执行一次)

  1. MovePosition是用于设置游戏对象的新位置(受物理引擎和碰撞),Rigidbody的一个方法,与直接修改transform.position不同
  2. this.transform.position当前游戏对象在世界空间中的当前位置。(this.gameObject.transform.position)的简写
  3. this.transform.forward当前游戏对象的前方方向向量,forward是transform的一个属性,确定方向,另外this.gameObject.transform.Rotate,中Rotate也是属性
  4. Time.deltaTime: 这是Unity中表示从上一帧到当前帧所经过的时间(以秒为单位)的变量(速度乘以时间)

3. this.gameObject.transform.Rotate(Vector3.up * H_Value * rotateSpeed * Time.deltaTime);

  1. Rotate: 是Transform类的一个方法,用于旋转游戏对象。它接受一个Vector3类型的参数,表示绕每个轴(x, y, z)旋转的角度(以度为单位)
  2. Vector3.up代表向上的轴,表示绕y轴(即上下轴)的旋转。Vector3.right :沿 X 轴向右
  3.  Vector3.forward,沿 Z 轴向前
  4. 4.shellRigidbody.velocity = shellpos.forward * shellSpeed;
  1. velocity: 这是Rigidbody组件的一个属性,代表游戏对象的速度
  2. shellpos.forward和前面this.transform.position类似理解

总结下:使用Rigidbody组件,先实例化再调用里面的方法与属性从而操纵物体

但一定要先安装上刚体;具体的方法有:MovePosition

属性:velocity

transform 属性:positionforward  方法:Rotate

tranformgameObject用作名词开头小写,动词:大写)

枚举:

public enum TankType 

    Tank_One = 1, 

    Tank_Two = 2, 

    Tank_Enemy = 3,  //目前是枚举类型

}

定义了一个名为TankType的枚举,它有三个成员,分别表示不同类型的坦克,每个成员都关联了一个整数值

具体调用:(枚举类型有点难理解后面介绍)

  1. public TankType = TankType.Tank_One;
  1. 实例化TankType类型的tankType
  2. TankType.Tank_One是初始值
  1. inputHorizontalStr = inputHorizontalStr + (int)tankType;

inputVerticalStr = inputVerticalStr + (int)tankType;

inputFireStr = inputFireStr + (int)tankType;

不同类型坦克对应不同按键(Horizontal,Vertical,Fire)

(int)tankType 将 tankType 枚举值转换为它的整数值。

Transform:

克隆:Instantiate

shellobj = Instantiate(shell, shellpos.position, shellpos.transform.rotation);

在shellpos的位置和方向上克隆shell(这个在前面用public 访问代表子弹)

访问各类东西:(对应变量有该类型下的方法与属性)

public Transform shellpos;

public GameObject shellobj;

public Rigidbody _rigidbody;

public Slider phSlider;

public ParticleSystem tankExplosion;

碰撞状态:

  1. 碰撞状态通常是通过碰撞检测来确定的,包括两种主要的碰撞类型:物理碰撞(Collision)和非物理碰撞(Trigger)。
  2. Collision触发碰撞事件三种状态:OnCollisionEnter(碰撞开始)、OnCollisionStay(碰撞持续)和OnCollisionExit(碰撞结束)。这些状态可以帮助开发者精确地控制和处理碰撞事件。
  3. 非物理碰撞(触发器)不会与其他碰撞器产生物理相互作用(如反弹或摩擦力),但会触发事件。
  4. 对于需要坦克扣血且有爆炸力(需要Collision)而对于炮弹(小时并产生爆炸效果)

控制碰撞伤害:

public LayerMask tankMask;

Collider[]tankColliders = Physics.OverlapSphere(this.transform.position, explosionRadius, tankMask);

Collider[] tankColliders: 这是一个Collider类型的数组,用于存储查询结果。

Physics.OverlapSphere: Unity物理引擎提供的一个方法,用于查询一个指定半径的球体范围内的所有碰撞体。

this.transform.position: 这表示当前对象(即执行这行代码的对象)在世界空间中的位置。transform是Unity中每个游戏对象都有的一个组件,它包含了对象的位置、旋转和缩放信息。

explosionRadius: 这是一个变量,代表球体的半径。从当前对象的位置开始,这个半径定义了查询的范围。

tankMask: LayerMask类型的变量,用于指定哪些层的物体应该被包括在查询中。在Unity中,LayerMask用于过滤掉不需要的层,确保查询只返回特定层的物体。

按键控制

H_Value = Input.GetAxis(inputHorizontalStr);

V_Value = Input.GetAxis(inputVerticalStr);

  • Input.GetAxis 是一个常用的方法来获取用户的输入
  • H_Value 变量用于存储水平轴上的输入值。
  • V_Value 变量用于存储垂直轴上的输入值。
  • inputHorizontalStr 应该是一个字符串变量,它包含了你在Unity的Input Manager中定义的水平输入轴的名称。

Input.GetButtonDown(inputFireStr)或者Input.GetButtonDown(KeyCode.Space)

inputFireStr可以代表Space

调色坦克

MeshRenderer[] tankOnerenderers = tankOne.GetComponentsInChildren<MeshRenderer>();

for (int i = 0; i < tankOnerenderers.Length; i++)

  • {

    tankOnerenderers[i].material.color = tankOneColor;

}

  • 获取了tankOne游戏对象及其所有子对象上的所有MeshRenderer组件,并将它们存储在一个MeshRenderer类型的数组中,命名为tankOnerenderers

坦克大战游戏制作过程:

  1. 认识组件,属性,环境
  2. 下载组件从asset store(这边有一个问题导入老师给的组件,可能因为版本的问题出错,不知道有没有影响)
  3. 放置模型(model)坦克,子弹顺便添加爆炸特效预设体(prefabs)(tankExplosion,shellExplosion)
  4. 添加刚体:Rigidbody(对于坦克和子弹)(关键是实现物体的移动)

里面有许多属性,可以视作一个类(前进后退旋转)

锁定一些轴,不会让坦克翻了

  1. 添加碰撞体(capsule collider)此处选择了胶囊状(对于子弹)

后来我看到有一个视频直接用mesh collider(直接包裹,不用调位置与大小)

添加碰撞体(包围坦克,此处用的是正方体)使坦克后期能动起来(由于当时使用的是两个碰撞体,所以后面伤害是两倍,需要优化)

  1. 如何摆放摄像机(important)

要让游戏界面作为我们的第二视角,了解最快捷方式(重要)

  1. 添加slider canvas(用来制作血条)
  2. 调整光线(使光线变柔和)(影响不大的)
  3. 添加脚本(通过脚本控制整个坦克运动,发射子弹)
  1. 给坦克添加脚本(脚本中相关知识目前有些理解不清,有些是unity中的名词)

下面简要做个解释

第一步:坦克移动

主要原理:

(1)通过Rigibdoby刚体结合Input输入控制坦克移动

注:这边添加脚本时命名时要立即命名,如果没有后面改名会导致在C#中定义的类会与后续改名不一致,导致C#脚本无法与游戏连接上,无法编译。

(2)关于Project setting几点说明

修改必须在游戏运行结束后(否则给等于没改)

此处添加了枚举类型所以对应要适当改变轴按钮设置(有个大问题:关于设置按钮总是报错,应该没问题,还有因为我设置了多个脚本均设置了TankType枚举类型,它上面指明不能这样做,相当于重复定义)

          这里关于public的介绍:

访问修饰符,用于指定类型或类型成员的可见性。public意味着该类型或成员可以从任何其他代码位置访问,无论是在相同的程序集(Assembly)内还是在不同的程序集中。

第二步发射炮弹:

先在坦克上放一个发射位置,克隆一颗炮弹,并通过炮弹Rigidbody给炮弹一个矢量速度,让炮弹发射,设置按键控制子弹发射

要点:

1.发射位置应与坦克相连(成为坦克的子物体)

2.如何克隆炮弹(这一点在后面坦克生成上也有出现)  Instantiate用法

3.稳定性考量(确定发生物体是否存在)

4.定义的函数属于在start和Update之外的方法

第三步炮弹碰撞有特效且对坦克造成伤害:

  1. 碰撞发生要求:双方均有碰撞体,且有一方有刚体

伤害发生在碰撞发生一开始用CollisionEnter方法

  1. 明确要求:发出一颗子弹造成伤害的对象(爆炸范围的坦克且不同距离的坦克伤害不同)
  2. 解决方案:设置一个图层,只有特定图层内的才受到伤害
  3. Play on wake 觉醒后启动(即在实例化后启动发挥作用) 对于shellExplosion
  4. 扣血机制PH

第三步在特定位置生成坦克移动互打:

  1. 设置两个位置(成为坦克的重生地)
  2. 分别在不同位置不同方向克隆两个坦克
  3. 分别两个坦克对tankcontrol_2对应实例化,从而调用里面的方法和属性

(虽然TankType不会因为是不同类导致无法使用,但是它必须要先实例化才能使用,所以有两种办法,一种是在实例化一次,二是直接调用tankcontrol_2,直接使用里面的类和属性)

  1. 调颜色分别驱动坦克(涉及一个数组)

第四步摄像机跟着坦克跑

1.

2.

碰撞的问题

预制件更新(tank >>default>>player再overrides>>apply)什么意思

先实践后理论

翻新版:

认识一些基本组件以及其对应的属性:

  1. Rigidbody

Rigidbody component reference

使用 "刚体"Rigidbody)组件将 "刚体"Rigidbody)应用到游戏对象上。()

  1. Mass 定义游戏对象的质量(单位:千克)。质量默认设置为 1
  2. Drag定义刚体线速度的衰减率,以模拟阻力、空气阻力或摩擦力。
  3. Angular Drag定义刚体旋转速度的衰减率,以模拟阻力、空气阻力或摩擦力。
  4. Is Kinematic 在游戏对象的物理运动和机械运动之间切换。启用 "机械运动 "后,物理系统无法施加力来移动或旋转 GameObject,相反,Unity 只能通过变换来移动和旋转 GameObject

Unity 中,不基于物理的运动称为运动学运动。Rigidbody 组件具有 "Is Kinematic(机械运动)"属性,启用该属性后,所连接的 GameObject 将被定义为非物理对象,并脱离物理引擎的控制。这样,您就可以通过 "变换 "对其进行运动学移动,而不会被 Unity 的物理模拟计算覆盖。

  1. 定义物理系统如何检测此 Rigidbody 碰撞器与场景中其他碰撞器之间的碰撞。Unity 会为每对碰撞产生一次碰撞,并根据碰撞检测属性确定碰撞检测方法。
  2. Constraints限制刚体的移动。

Freeze Position

有选择地停止刚体沿世界 XY Z 轴的移动。

- Freeze Rotation

有选择地停止刚体围绕局部 XY Z 轴旋转。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/882712
推荐阅读
相关标签
  

闽ICP备14008679号