弹药补给实现 攻击一个敌人时,有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 ); } } }
弹药消失 子弹击中敌人后要消失,如果子弹超过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 )); } }
我们使用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);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);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
了,而且更加平滑
弹药转身 Bullet
是Palyer
的子集,所以每次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; } } }