关于护盾特效,要想启用一段时间后取消,需要先将其关联与一个游戏物体形成父子关系,再将关联后的护盾特效拉进特效引用之中,而非单独的护盾预制体,否则其特效会一直显示。
关于护盾特效,要想启用一段时间后取消,需要先将其关联与一个游戏物体形成父子关系,再将关联后的护盾特效拉进特效引用之中,而非单独的护盾预制体,否则其特效会一直显示。
Destroy(collisio.gameObject);为销毁掉接触的物体,Destroy(gameObject);为销毁掉物体自身。
x轴:vector3.right
y轴:vector3.up
float h = Input.GetAxis("Horizontal");
transform.Translate(Vector3.right * h * moveSpeed * Time.deltaTime, Space.World);
//三维向量,方向×按键输入×移动速度×按时间运动(每秒10米而不是每桢10米),空间为整个空间。
float v = Input.GetAxis("Vertical");
transform.Translate(Vector3.up * v * moveSpeed * Time.deltaTime, Space.World);
//三维向量,方向×按键输入×移动速度×按时间运动,空间为整个空间。
判断位置列表是否包含位置可以使用 List 的Contains 方法,用于判断列表中是否包含某个元素。
while (true)
{
Vector3 createPostion = new Vector3(Random.Range(-9, 10), Random.Range(-7, 8), 0);
if (!itemPositionList.Contains(createPostion))
{
return createPostion;
}
}
为什么刚体要添加在运动的物体上面
为什么触发器要双方都带有触发器的才能正常工作
translate中的世界坐标系与self坐标系的区别
其实在一开始控制坦克的朝向那里,不使用替换的方式而是直接改变坦克本身朝向的话,这里就可以直接 transform.rotation 而不需要再去+子弹应该旋转的角度了。
坦克移动控制代码优化,原先的有个奇怪的问题,按住W或者S的时候没法左右移动,因为 v != 0 被 return 掉了。
public float speed = 3;
private List<string> codelist = new List<string>();
private string lastKeyCode = string.Empty;
// Update is called once per frame
void Update()
{
SetLastKeyCode();
}
private void FixedUpdate()
{
PlayerMove();
}
private void PlayerMove()
{
Vector3 vector = new Vector3();
Quaternion quaternion = new Quaternion();
switch (lastKeyCode)
{
case "W":
vector = new Vector3(0, speed * Time.deltaTime, 0);
quaternion = Quaternion.Euler(0.0f, 0.0f, 0.0f);
break;
case "S":
vector = new Vector3(0, -speed * Time.deltaTime, 0);
quaternion = Quaternion.Euler(0.0f, 0.0f, 180.0f);
break;
case "A":
vector = new Vector3(-speed * Time.deltaTime, 0, 0);
quaternion = Quaternion.Euler(0.0f, 0.0f, 90.0f);
break;
case "D":
vector = new Vector3(speed * Time.deltaTime, 0, 0);
quaternion = Quaternion.Euler(0.0f, 0.0f, -90.0f);
break;
default:
vector = new Vector3(); break;
}
if (lastKeyCode != "")
{
//设置坦克的朝向
transform.rotation = quaternion;
//设置坦克的位置
transform.Translate(vector, Space.World);
}
}
#region SetLastKeyCode
private void SetLastKeyCode()
{
#region KeyDown
if (Input.GetKeyDown(KeyCode.W)) { MoveKeyDown("W"); }
if (Input.GetKeyDown(KeyCode.S)) { MoveKeyDown("S"); }
if (Input.GetKeyDown(KeyCode.A)) { MoveKeyDown("A"); }
if (Input.GetKeyDown(KeyCode.D)) { MoveKeyDown("D"); }
#endregion
#region KeyUp
if (Input.GetKeyUp(KeyCode.W)) { MoveKeyUp("W"); }
if (Input.GetKeyUp(KeyCode.S)) { MoveKeyUp("S"); }
if (Input.GetKeyUp(KeyCode.A)) { MoveKeyUp("A"); }
if (Input.GetKeyUp(KeyCode.D)) { MoveKeyUp("D"); }
#endregion
}
private void MoveKeyDown(string keyCode)
{
if (!codelist.Contains(keyCode))
{
codelist.Add(keyCode);
}
if (codelist.Count > 0)
{
var key = codelist[codelist.Count - 1];
lastKeyCode = key;
}
}
private void MoveKeyUp(string keyCode)
{
codelist.RemoveAll(key => key.Contains(keyCode));
if (codelist.Count > 0)
{
var key = codelist[codelist.Count - 1];
lastKeyCode = key;
}
else
{
lastKeyCode = string.Empty;
}
}
#endregion
本章AI人工智能:并非AI,而是随机数
1. 通过Sprite Renderer组件中的Sorting Layer可以和Order in Layer调整物体的层级;order值越高越后渲染,越优先显示
1. 发生碰撞的条件:两者身上都有碰撞器,且至少一者身上有刚体
2. 刚体一般添加给运动的一方,因为物体物体长时间不运动时,其刚体组件会休眠,导致无法发生碰撞检测
3. 生命周期函数 FixedUpdate(),再Update()之后执行
4. FixedUpdate()和Update()说明:
①FixedUpdate():固定物理帧,每帧大小一致;物体受力不变,碰撞时不会发生抖动
②Update()每帧大小不一致,且因设备而异;物体受力发生改变,碰撞时会发生抖动
1. Unity以m位单位
2.
06:30,想起了siki老师讲的枚举类型了
此处没有禁用v和h监听按键的语句
v、h的控设置优先级,如果没有输入就return
先处理V纵向输入,如果有输入的话(!=0),就不再处理下面的H横向输入,直接return掉
动画制作小技巧:
选中project面板中需要做成动画的全部图片,然后拖入Hiearchy面板,会自动生成动画(三角形图标的是动画,四个小方块的是动画控制器)
一、背景设置:
camare-background——黑色
比例——5:4
size——8.5
以上数值可以自己调试
Windows-console
二、素材处理:
Texture Type——调为Sprite(2D and UI)
Sprite Mode:单张图single,图集multiple
三、切割图片
sprite editor-slice-Type{自动、以格子尺寸切割,以格子行量切割}
小窍门:一开始调节方格的大小到合适的尺寸,随后选择以格子尺寸切割
四、保存场景,整理文件夹
2D游戏与3D游戏X轴相反
欧拉角转四元数:
Quaternion.Euler();
single 处理单张图片
multipie 处理多张小图
刚体挂在移动的物体上
另一个挂碰撞器