1.由玩家向正前方发射一条射线,将敌人血量打击至0时对敌人游戏对象进行销毁
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Player : MonoBehaviour
{
void Update()
{
Move();
Fire();
PlayAnimation();
}
void Move()
{
float x = Input.GetAxis(StaticGameResources.Horizontal);
float z = Input.GetAxis(StaticGameResources.Vertical);
Vector3 dir = new Vector3(x, 0, z);
if (x != 0 || z != 0)
{
ps = PlayerState.Walk;//当玩家任意移动时切换动画状态为移动状态;
cc.SimpleMove(dir * Time.deltaTime * 1000);
transform.rotation = Quaternion.LookRotation(dir);
}
}
void Fire()
{
if (Input.GetMouseButtonDown(0))
{
audios.Play();
ps = PlayerState.Shoot;//玩家切换动画状态;//在游戏资源管理器类中开辟了枚举,用于记录玩家动画状态,开火瞬间需要通过动画将玩家模型用枪指向正前方;
Ray ray = new Ray(transform.position+new Vector3(0,0.5f,0), transform.forward);//由玩家向正前方发射一条射线,由于射线会从游戏对象的底端发射,射线的起始位置需要根据测量提高;
RaycastHit hit;
Physics.Raycast(ray, out hit);
Debug.DrawLine(ray.origin, hit.point,Color.red,100);//绘制射线便于观察;
if (hit.collider.CompareTag(StaticGameResources.spiderTag))
{
Spider spider = hit.collider.GetComponent<Spider>();//由于敌人身上的角色控制器无法检测射线的碰撞,所以敌人的血量由射线碰撞反馈的碰撞器信息对敌人血量进行处理,每个敌人都是独立的血量,通过获取组件的方式拿到对应敌人的血量;
spider.blood--;
if (spider.blood==0)//当敌人血量降低为0时进行积分的累加以及敌人的销毁包括特效的克隆以及爆炸音效的播放
{
GameManager.GetInstance().score += 10;//通过单例模式对玩家积分进行累加;
Destroy(hit.collider.gameObject);
GameObject go=Instantiate(explosion,hit.point,Quaternion.identity);
go.AddComponent<AudioSource>();//若敌人身上挂在声音组件,在敌人销毁的瞬间,声音的播放将会收到影响,所以采取在敌人的位置生成新的空物体,作为特效以及声音播放的载体;
go.GetComponent<AudioSource>().clip = explosionClip;
go.GetComponent<AudioSource>().Play();
Destroy(go,1f);
}
}
}
}
void PlayAnimation()
{
switch (ps)
{
case PlayerState.Idle:
an.Play(StaticGameResources.playerIdle);//通过比对枚举值播放相应动画
break;
case PlayerState.Walk:
an.Play(StaticGameResources.playerWalk);//在行走动画切换至其他动画时需要留有动画过渡时间,让当前动画播放完毕才播放下一个状态的动画;
ChangeState(PlayerState.Walk);
break;
case PlayerState.Shoot:
an.Play(StaticGameResources.playerShoot);
ChangeState(PlayerState.Shoot);
break;
default:
break;
}
}
void ChangeState(PlayerState ps)
{
switch (ps)
{
case PlayerState.Idle:
break;
case PlayerState.Walk:
Invoke(StaticGameResources.playerWalk, walkTimer);//等待行走动画时间结束,切换动画状态
break;
case PlayerState.Shoot:
Invoke(StaticGameResources.playerShoot, shootTimer);
break;
default:
break;
}
}
void Walk()
{
ps = PlayerState.Idle;
}
void Shoot()
{
ps = PlayerState.Idle;
}
}
2、游戏开始5秒后在不同地方随机生成3个敌人(用Invoke),当敌人全部消灭后,在不同地方随机生成3个敌人
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class GameManager : MonoBehaviour
{
public float playerLife;
void Start()
{
playerLife = 100;//在方法外赋值无效;
Invoke("Clone", 5f);
}
void Clone()
{
for (int i = 0; i < 3; i++)
{
float x = Random.Range(4,11);
float z = Random.Range(-24,-17);
Instantiate(spider,new Vector3(x,transform.position.y,z),Quaternion.identity);//在游戏管理器附近进行克隆
}
}
void Update()
{
img.fillAmount= playerLife / 100;
Score.text=score.ToString();
if (GameObject.FindWithTag(StaticGameResources.spiderTag)==null&&Time.time>=5.9f)
{
Clone();
}//在游戏进行超过5s之后,通过查找标签的方式确认游戏场景中没有敌人再进行克隆
}
}
3、当玩家距离敌人5米,敌人走向玩家;距离玩家3米时攻击玩家
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Spider : MonoBehaviour
{
void Update()
{
//PlayAnimation();
if (Vector3.Distance(transform.position,player.transform.position)<5)
{
if (Vector3.Distance(transform.position, player.transform.position) < 3)
{
//ss = SpiderState.Attack;//敌人无法使用状态切换,动画切换会卡死在播放的第一帧;
an.Play(StaticGameResources.spiderAttack);
if ((attackTimer -= Time.deltaTime) <=0)//当敌人完成攻击动画的同时对玩家血量降低;
{
GameManager.GetInstance().playerLife--;
attackTimer = an[StaticGameResources.spiderAttack].length;//将动画播放时长复原
}
}
else
{
//ss = SpiderState.Walk;
an.Play(StaticGameResources.spiderWalk);
transform.LookAt(player.transform.position);
cc.SimpleMove(player.transform.position * Time.deltaTime * 10);
}
}
}
}