---------------------------相关功能实现--------------------------------
1、人物移动
人物的移动依旧是利用在Update中获取键盘输入的"Horizontal"和"Vertical"的值,在FixedUpdate中更新角色的位置。
private void Update()
{
movement.x = Input.GetAxis("Horizontal");
movement.y = Input.GetAxis("Vertical");
if (movement == new Vector2(0, 0)){
playerAnima.SetBool("run", false);
}
else{
playerAnima.SetBool("run", true);
}
}
private void FixedUpdate(){
rigidbody.MovePosition(rigidbody.position + movement * moveSpeed * Time.fixedDeltaTime);
}
2、人物朝向
人物朝向其实附带功能还有武器朝向,我写了一个Target字段现在赋值为鼠标位置,有需要也可以修改(比如改为自瞄),考虑到武器种类不同的情况下瞄准方式也会不一样,所以人物的朝向和武器的朝向是各自管理的。
3、鼠标左键操作逻辑
这个按键需要判断四种状态:一种是玩家在可互动物体周围时左键操作为“互动”,比如现在做的是捡起枪。另外则是长按、短按和抬起,不同武器在长按、短按、抬起这三个状态下的操作是不一样的。
为了判断玩家是否在可互动物体的周围,我在Update中每帧由玩家向周围发射射线检测是否碰撞到可互动物体,这里因为只有枪就只做了枪的判断未进一步优化。
weaponInFloor = null;
Collider2D[] cols = Physics2D.OverlapCircleAll(transform.position, 1);
if (cols.Length > 0){
for (int i = 0; i < cols.Length; i++){
if (cols[i].CompareTag("Weapon")){
weaponInFloor = cols[i].gameObject;
}
}
}
根据射线检测的结果和按键的情况分别执行对应的操作:
if (weaponInFloor != null && fireKeyDown){
GetWeapon();
}
else{
if (fireKeyDown){
if (weapon != null){ weapon.ShootButtonDown(); }
else{ Debug.Log("没有武器只能手刀撒"); }
}
else if(fireKeyPressed){
if (weapon != null){ weapon.ShootButtonPressed();}
}
if(fireKeyUp){
if (weapon != null){ weapon.ShootButtonUp(); }
}
}
GIF
武器的拾取需要根据玩家手上是否持有武器做不同动作,相应的武器身上也要有被捡起放下的两个对应方法:
void GetWeapon(){
if (weaponInFloor != null){
//地上有枪就换枪
if (weapon != null){
myWeapon.transform.SetParent(GameManager.instance.weaponRecycle);
weapon.PickDown();
}
myWeapon = weaponInFloor;
weapon = myWeapon.GetComponent
weapon.Pickup();
myWeapon.transform.SetParent(transform);
myWeapon.transform.localPosition = new Vector3(0, 0, 0);
myWeapon.transform.localRotation = Quaternion.identity;
//注册
weapon.Initialization(gameObject.tag, gameObject.layer);
}
}
不同武器在对应的状态方法中编辑该状态下的操作即可。
//例:Gun
public override void ShootButtonDown(){
if (Time.time - timing >=CD){
timing = Time.time;
GameObject bullet = Instantiate(bulletPrefab, pos.position, pos.rotation*Quaternion.AngleAxis(Random.Range(0,shake),Vector3.forward));
bullet.GetComponent
GetComponent
}
}
public override void ShootButtonPressed(){
if (Time.time - timing >=CD){
timing = Time.time;
GameObject bullet = Instantiate(bulletPrefab, pos.position, pos.rotation*Quaternion.AngleAxis(Random.Range(0,shake),Vector3.forward));
bullet.GetComponent
GetComponent
}
}
4、镜头跟随
镜头跟随这块直接用了Cinemachine,跟着马老师的视频设置就可以啦:
【简明UNITY教程】不用写代码的高级2D摄像机 Cinemachine
三、凑一个小标题(有感而发)
由于中间跑去学ShaderGraph再回头看俯视角射击有种恍若隔世的感觉,慢慢找回写代码的状态思路也更清晰了一些,但其实对自己现在写的这个Demo并不是太满意,大概会有漫长的打磨吧。
同时认识到以前对俯视角射击看得太简单了,又或者说其实我写的确实是俯视角射击,但他离一个完整的游戏还是太远了。还需要更加努力,了解更多同质类型的游戏,也需要学习更多类型的游戏。