弹药补给实现

攻击一个敌人时,有20%的概率不增加子弹,80%的概率增加1~3枚子弹。

直接修改KillEnemyCommand就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using FrameWorkDesign;
using UnityEngine;//

namespace ShootingEditor2D
{
public class KillEnemyCommand : AbstractCommand
{
protected override void OnExecute()
{
this.GetSystem<IStatSystem>().KillCount.Value++;
var randomIndex = Random.Range(0, 100);//

if(randomIndex < 80)//
this.GetSystem<IGunSystem>().CurrentGun.AmmoNum.Value += Random.Range(1, 4);//Random.Range不包含右值,所以是(1,4)
}
}
}

弹药消失

子弹击中敌人后要消失,如果子弹超过5秒后没有击中也要消失。直接修改Bullet脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using UnityEngine;
using FrameWorkDesign;

namespace ShootingEditor2D
{
public class Bullet : MonoBehaviour,IController
{
private Rigidbody2D m_Rigidbody;

private void Awake()
{
m_Rigidbody = GetComponent<Rigidbody2D>();

Destroy(gameObject, 5);//
}

//...

private void OnCollisionEnter2D(Collision2D collision)
{

if (collision.gameObject.CompareTag("Enemy"))
{
Destroy(collision.gameObject);
this.SendCommand<KillEnemyCommand>();

Destroy(gameObject);//
}
}

//...
}
}

角色转身

修改Player脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using UnityEngine;

namespace ShootingEditor2D
{
public class Player : MonoBehaviour
{
//...

private void FixedUpdate()
{
var horizontalAxis = Input.GetAxis("Horizontal");

if(horizontalAxis * transform.localScale.x < 0f)
{
var nlocalScale = transform.localScale;
nlocalScale.x = -nlocalScale.x;
transform.localScale = nlocalScale;
}

//...

}
}
}

修改转身时摄像机偏移

如果我们想在角色转身时实现摄像机偏移,可以这样修改CameraController脚本

1
2
3
4
5
6
7
8
9
10
using UnityEngine;

public class CameraController : MonoBehaviour
{
//...
var cameraPos = mPlayerTrans.TransformPoint(new Vector3(3,3,-10));//只需要修改Vector3即可

//...
}
}

我们使用mPlayerTrans.TransformPoint方法来指定Camera的位置,所以Player的position、Rotation、Scale信息都可以直接影响到Camera。所以几乎不用修改代码

贴一个教程中使用的方式

1
2
3
4
5
6
7
8
var cameraPos = transform.position;
var isRight = Mathf.Sign(mPlayerTrans.localScale.x);//Mathf.Sign返回参数的正负,参数是正数返回1,负数返回-1

var playerPos = mPlayerTrans.transform.position;
cameraPos.x = playerPos.x + 3 * isRight;
cameraPos.y = playerPos.y + 2;

transform.position = cameraPos;

控制摄像机范围

修改和整理一下CameraController脚本,让它变得更通用一些。这样编辑mMinX、mMaxY、mMinY、mMaxY就能限制Camera的范围了,编辑mTargetPos就能设置Camera相对目标的位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using UnityEngine;

public class CameraController : MonoBehaviour
{
[SerializeField] private float mMinX = -5;
[SerializeField] private float mMaxX = 5;
[SerializeField] private float mMinY = -5;
[SerializeField] private float mMaxY = 5;

[SerializeField] private Vector3 mTargetPos = new Vector3(3,3,-10);

[SerializeField] private float smoothTime = 0.5f;

Transform mPlayerTrans;

Vector3 velocity = Vector3.zero;

void Update()
{
if (!mPlayerTrans)
{
var playerGameObj = GameObject.FindGameObjectWithTag("Player");

if (playerGameObj)
{
mPlayerTrans = playerGameObj.transform;
}
else
{
return;
}

}


var targetPosRaw = mPlayerTrans.TransformPoint(mTargetPos);

var targetPos = new Vector3(Mathf.Clamp(targetPosRaw.x,mMinX,mMaxX),Mathf.Clamp(targetPosRaw.y,mMinY,mMaxY),targetPosRaw.z);

var currentPos = gameObject.transform.position;

transform.position = Vector3.SmoothDamp(currentPos,targetPos,ref velocity,smoothTime);
}
}

这里我们使用Mathf.Clamp限制摄像机在世界坐标的位置,这个函数返回限定在最大值和最小值之间的值

这里贴一下教程中使用的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var Vector3 TargetPos;
var isRight = Mathf.Sign(mPlayerTrans.localScale.x);//Mathf.Sign返回参数的正负,参数是正数返回1,负数返回-1

var playerPos = mPlayerTrans.transform.position;
TargetPos.x = playerPos.x + 3 * isRight;
TargetPos.y = playerPos.y + 2;
TargetPos.z = -10;

var smoothSpeed = 5;

//增加一个平滑处理
var position = transform.position;
position = Vector3.Lerp(position,new Vector3(TargetPos.x,TargetPos.y,position.z),smoothSpeed * Time.deltaTime);

//锁定在一个固定区域
transform.position = new Vector3(Mathf.Clamp(position.x,mMinX,mMaxX),Mathf.Clamp(position.y,mMinY,mMaxY),position.z);

教程中使用Vector3.Lerp来平滑摄像机的移动,这个函数是线性移动,而且需要引入Time.deltaTime,而我们使用的Vector3.SmoothDamp函数内部已经引入Time.deltaTime了,而且更加平滑

弹药转身

BulletPalyer的子集,所以每次Instantiate时自身的lossyScale也会根据Player的朝向而变化,我们使用Mathf.Sign并赋给初始速度即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using UnityEngine;
using FrameWorkDesign;

namespace ShootingEditor2D
{
public class Bullet : MonoBehaviour,IController
{
//...

private void Start()
{
var isRight = Mathf.Sign(transform.lossyScale.x);//
m_Rigidbody.velocity = Vector2.right * 10 * isRight;
}

//...
}
}