今天总体还是顺利的,但是在这个过程之中,还是有一些曲折
第一个问题
关于特效,在此用代码记录public ParticleSystem swordEffectLeft;
public ParticleSystem swordEffectight;//两个特效
这里是特效的申明
swordEffectLeft.Play();
这里是引用
然后就是一直遇到一个问题,在一开始的时候,没有点击鼠标(因为我的鼠标是input)但是特效直接开始播放.后来把所有有关代码都删了一遍之后还是没有排除出来问题.最后发现是
以上是第一个问题折腾了很久
学到就是赚到!
接下来就是今天关于力方向的公式分析了 以及之后我想做的横板游戏中可以加入的GameMode 摘抄出来 以备不时之需
public void GroupBlowout()
{
Vector3 blowout;//怪物飞散的方向,含速度
Vector3 blowoutUp;//飞散方向的垂直变量
Vector3 blowoutRight;//飞散方向的水平变量
float topRadius;//圆锥的顶面半径
float arcLength;//圆锥顶面飞散范围,根据bot数量决定
float upAngle;//绕Y轴旋转角度
float upAngleCenter;//初始中心
float upAngleSwing;//偏移角
float rightAngle;//绕X轴旋转角度
float blowoutSpeed;//速度
float blowoutSpeedVary;//速度变化调控
topRadius = 0.3f;//圆锥的顶面半径 0.3
blowoutSpeedVary = 10.0f;//速度变化 10
rightAngle = 40.0f;//绕X轴旋转角度
upAngleCenter = 180.0f;//垂直向上?
upAngleSwing = 10.0f;//偏移角 10°
//随机一个圆锥前后倾斜角度
rightAngle += Random.Range(-5.0f, 5.0f);
//根据怪物数量决定圆周顶面的飞散弧长,不能超过120;
arcLength = bots.Length * 30.0f;
arcLength = Mathf.Min(arcLength, 120.0f);
//围绕Y轴的旋转角
upAngle = upAngleCenter;
upAngle += upAngleSwing;
foreach (BotCharacter bot in bots)
{
blowoutUp = Vector3.up;//飞散圆锥的中心
blowoutRight = Vector3.forward * topRadius;//飞散圆锥的顶面中心到顶面边缘的向量;
blowoutRight = Quaternion.AngleAxis(upAngle, Vector3.up) * blowoutRight;//将上一步得到的向量绕Y轴旋转upAngel
blowout = blowoutUp + blowoutRight;//两向量相加得到的代表飞散方向的第三向量
blowout.Normalize();
//飞散方向计算上前后倾斜
blowout = Quaternion.AngleAxis(rightAngle, Vector3.right) * blowout;
//飞散开的速度
blowoutSpeed = blowoutSpeedVary * Random.Range(0.8f, 1.5f);
blowout *= blowoutSpeed;
//角速度
//平方后得到的第三向量,与飞散方向的Y轴垂直,便是旋转怪物的方向
Vector3 angular_velocity = Vector3.Cross(Vector3.up, blowout);
angular_velocity.Normalize();
angular_velocity*=Random.Range(0.5f,1.5f)*blowoutSpeed;
//应用
bot.Blowout(blowout, angular_velocity);
//改变Y轴旋转角,让每个怪物飞散的方向都在顶面弧长的不同位置
upAngle+=arcLength/(bots.Length);
}
我个人认为这个最后的效果应该是一个倒圆锥飞出去的轨迹.这一块代码可以用来借鉴,用来保留.
//本怪物最多生成多少组怪物
public float botGroupTotal = 5;
//当前生成了多少组怪物
private int botGroupCount = 0;
private int score = 0;
//怪物组内的怪物数量
int spawnBotNum = 1;
int spawnBotNumMax = 5;
private int spawnIncreaseCount = 1;
private int spawnNormalCount = 5;
bool canSpawnNewGroup = false;
BotGroup.Type spwanGroupTypeCurrent = BotGroup.Type.Normal;
BotGroup.Type spwanGroupTypeNext = BotGroup.Type.Normal;
private float spawnLine;
private float spawnLineNextOffect = 50.0f;
public const float spawnLineNextOffectMin = 20.0f; // 怪物出现间隔的最小值
public const float spawnLineNextOffectMax = 50.0f; // 怪物出现间隔的最大值
private float spawnNextSpeed = 1f;
public float spawnNextSpeedMin = 1.0f; // 移动速度的最小值
public float spawnNextSpeedMax = 6.0f; // 移动速度的最高值
private float spawnPosOffect = 15f;
PlayerCharacter character;
private void SpawnBotGroup(BotGroup.Type type)
{
float speed = spawnNextSpeed;
Vector3 spawnPos;
spawnPos = character.transform.position;
spawnPos.z += spawnPosOffect;
switch (spwanGroupTypeCurrent)
{
case BotGroup.Type.slow:
{
speed = 1.0f;
}
break;
case BotGroup.Type.Normal:
{
speed = spawnNextSpeed;
}
break;
}
BotGroup botGroup = GameObject.Instantiate<BotGroup>(botGroupPrefab);
//怪物组生成的Y轴位置处于自身碰撞盒范围的一半
var extents = botGroup.GetComponent<Collider>().bounds.extents;
spawnPos.y = extents.y / 2;
botGroup.transform.position = spawnPos;
//怪物组生成内部怪物
botGroup.SpawnBot(spawnBotNum);
botGroup.runSpeed = speed;
}
public void UpdateNextGroupType()
{
//还有要生成的正常怪物时,先生成正常怪物
if (spawnNormalCount > 0)
{
float rate;
//用于计算10个以内的怪物加速
rate = (float)botGroupCount / 10.0f;
rate = Mathf.Clamp01(rate);
//砍杀的怪物越多,下一批怪物的速度也越快,
//通过rate,来在最大和最小速度间插值,使得下一波的速度,与当前击杀怪物数量成正比
spawnNextSpeed = Mathf.Lerp(spawnNextSpeedMin, spawnNextSpeedMax, rate);
//砍杀的怪物越多,下一批怪物的来的也会越快,
//通过rate,来在最大和最小位置偏移中插值,使得下一波怪物到来的偏移位置,与当前击杀怪物数量成反比
spawnLineNextOffect = Mathf.Lerp(spawnLineNextOffectMax, spawnLineNextOffectMin, rate);
spawnNormalCount--;
if (spawnNormalCount <= 0)
{
//当普通型怪物都生成完后,随机一种增强型怪物
spwanGroupTypeNext = (BotGroup.Type)Random.Range(1, 1);
spawnIncreaseCount = 1;
}
return;
}
//有要生成的强化类怪物时,生成强化类怪物
if (spawnIncreaseCount > 0)
{
spawnIncreaseCount--;
if (spawnIncreaseCount <= 0)
{
//强化类怪物生成完后,必定生成普通怪物
spwanGroupTypeNext = BotGroup.Type.Normal;
//下一轮随机生成多少组普通怪物
spawnNormalCount = Random.Range(3, 7);
}
return;
}
}
这一块的代码是用来控制怪物的数量以及什么时候产生怪物和产生什么怪物.也就是规则.之后也会继续用到,现在记录用来保存.
最后今天晚上,老高和我讨论,以下为杂谈的内容
为什么按动按键小球滚动,哪里来的力,forward会不会提供力.
按动按键小球滚动的原因是 systeam.unity里面的冲击力默认设置为1;
forward只是提供方向,不会提供力.但是在视角方向改变,会影响力.
以上仅为个人想法.代码来自B站皮皮关做游戏.
谢谢这个无私的up.
以上,就是今天的学习内容.