赞
踩
基本知识:
认识unity界面
5. 多选 复制 聚焦 激活 对齐
(1)多选(建议在任务框里选)
(2)聚焦 F键(或者双击列表上某个物体)
(3)对齐 正交视图下对齐
认识理解一些名词:
Rigidbody:
物理系统的核心组件,它负责控制游戏对象在物理世界中的运动。通过Rigidbody,你可以设置游戏对象的质量、阻力、是否受重力影响等物理属性,并可以通过代码或Unity编辑器来控制它的运动。
1._rigidbody = this.gameObject.GetComponent<Rigidbody>();
(1)简单来说就是用_rigidbody实例化this.gameObject的Rigidbody类
所以_rigidbody有Rigidbody类下的属性与方法
(2)具体:
2._rigidbody.MovePosition(this.transform.position+V_Value*this.transform.forward * speed * Time.deltaTime);(这个是放在Update方法里,每帧执行一次)
3. this.gameObject.transform.Rotate(Vector3.up * H_Value * rotateSpeed * Time.deltaTime);
总结下:使用Rigidbody组件,先实例化再调用里面的方法与属性从而操纵物体
但一定要先安装上刚体;具体的方法有:MovePosition
属性:velocity
transform 属性:position,forward 方法:Rotate
(tranform,gameObject用作名词开头小写,动词:大写)
枚举
:
public enum TankType
{
Tank_One = 1,
Tank_Two = 2,
Tank_Enemy = 3, //目前是枚举类型
}
定义了一个名为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;
碰撞状态:
控制碰撞伤害:
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.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;
}
坦克大战游戏制作过程:
里面有许多属性,可以视作一个类(前进后退旋转)
锁定一些轴,不会让坦克翻了
后来我看到有一个视频直接用mesh collider(直接包裹,不用调位置与大小)
添加碰撞体(包围坦克,此处用的是正方体)使坦克后期能动起来(由于当时使用的是两个碰撞体,所以后面伤害是两倍,需要优化)
要让游戏界面作为我们的第二视角,了解最快捷方式(重要)
下面简要做个解释
第一步:坦克移动
主要原理:
(1)通过Rigibdoby刚体结合Input输入控制坦克移动
注:这边添加脚本时命名时要立即命名,如果没有后面改名会导致在C#中定义的类会与后续改名不一致,导致C#脚本无法与游戏连接上,无法编译。
(2)关于Project setting几点说明
修改必须在游戏运行结束后(否则给等于没改)
此处添加了枚举类型所以对应要适当改变轴按钮设置(有个大问题:关于设置按钮总是报错,应该没问题,还有因为我设置了多个脚本均设置了TankType枚举类型,它上面指明不能这样做,相当于重复定义)
这里关于public的介绍:
访问修饰符,用于指定类型或类型成员的可见性。public意味着该类型或成员可以从任何其他代码位置访问,无论是在相同的程序集(Assembly)内还是在不同的程序集中。
第二步发射炮弹:
先在坦克上放一个发射位置,克隆一颗炮弹,并通过炮弹Rigidbody给炮弹一个矢量速度,让炮弹发射,设置按键控制子弹发射
要点:
1.发射位置应与坦克相连(成为坦克的子物体)
2.如何克隆炮弹(这一点在后面坦克生成上也有出现) Instantiate用法
3.稳定性考量(确定发生物体是否存在)
4.定义的函数属于在start和Update之外的方法。
第三步炮弹碰撞有特效且对坦克造成伤害:
伤害发生在碰撞发生一开始用CollisionEnter方法
第三步在特定位置生成坦克移动互打:
(虽然TankType不会因为是不同类导致无法使用,但是它必须要先实例化才能使用,所以有两种办法,一种是在实例化一次,二是直接调用tankcontrol_2,直接使用里面的类和属性)
第四步摄像机跟着坦克跑
1.
2.
碰撞的问题
预制件更新(tank >>default>>player再overrides>>apply)什么意思
先实践后理论
翻新版:
认识一些基本组件以及其对应的属性:
Rigidbody component reference
使用 "刚体"(Rigidbody)组件将 "刚体"(Rigidbody)应用到游戏对象上。()
在 Unity 中,不基于物理的运动称为运动学运动。Rigidbody 组件具有 "Is Kinematic(机械运动)"属性,启用该属性后,所连接的 GameObject 将被定义为非物理对象,并脱离物理引擎的控制。这样,您就可以通过 "变换 "对其进行运动学移动,而不会被 Unity 的物理模拟计算覆盖。
Freeze Position | 有选择地停止刚体沿世界 X、Y 和 Z 轴的移动。 |
- Freeze Rotation | 有选择地停止刚体围绕局部 X、Y 和 Z 轴旋转。 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。