PS:本系列笔记将会记录我此次在北京学习Unity开发的总体过程,方便后期写总结,笔记为日更。
笔记内容均为 自己理解,不保证每个都对
咕咕咕了好几天, 一直咕,一直爽
Part 1 NavMest:
使用方法:
1,设置代理 。 NavMeshAgent
2,设置路径 并且 navi static .
3,Bake.
4,设置终点。
Bake结果:
蓝色部分 为可以自动寻路部分。,黑色为可以跳跃的地方。
代码部分:实现鼠标点击自动寻路功能
public class NaviTest : MonoBehaviour
{
NavMeshAgent myAgent;
// Start is called before the first frame update
void Start()
{
//获得 NavMeshAgent 组件
myAgent = gameObject.GetComponent<NavMeshAgent>();
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0)) //检测鼠标按下
{
Ray tmpRay = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit tmpHit;
if(Physics.Raycast(tmpRay, out tmpHit, 100))
{
myAgent.SetDestination(tmpHit.point);
}
}
Part 2 简单塔防:
实现功能:
1、怪物自动生成
2、怪物自动寻路
3、区分选中与非选中建筑
4、炮塔射击,默认攻击距离当前炮塔最近的怪物
5、击中怪,怪掉血,0血死亡
怪物生成 就是利用 实例化方法:
Object tmpObj = Resources.Load("MidMonster");
GameObject tmpGameObj = GameObject.Instantiate(tmpObj) as GameObject;
tmpGameObj.transform.SetParent(tmpParent, false);
自动寻路利用 Part 1 的知识:
void Start() //怪物移动
{
target = GameObject.Find("End").transform;
myAgent = gameObject.GetComponent<NavMeshAgent>();
myAgent.SetDestination(target.transform.position); //移动目标 End.position
}
区分选中与未选中建筑 利用 射线击中方法:
Transform frontHit; //记录上一个选中的塔
// Update is called once per frame
void Update()
{
Ray tmpRay = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit tmpHit; //记录击中信息
if (Input.GetMouseButtonDown(1))
{
if (frontHit != null)
{
frontHit.GetComponent<Renderer>().material.color = Color.white; //上一个击中塔 恢复颜色
}
frontHit = null;
}
if (Input.GetMouseButtonDown(0))
{
if(Physics.Raycast(tmpRay, out tmpHit, 100)) //判断是否击中
{
if(tmpHit.transform.tag == "Tower") //判断击中物体是否为 Tower
{
if (frontHit != null) //上一个击中塔恢复颜色
{
frontHit.GetComponent<Renderer>().material.color = Color.white;
}
tmpHit.transform.GetComponent<Renderer>().material.color = Color.red; //当前击中塔 记为红色
frontHit = tmpHit.transform; //记录当前塔
Object tmpObj = Resources.Load("MyTower");
GameObject tmpGameObj = GameObject.Instantiate(tmpObj) as GameObject;
tmpGameObj.transform.position = tmpHit.point;
}
}
}
}
攻击距离最近怪物:
怪物管理器脚本:
public GameObject FindCloest(Transform tower) //找到距离炮塔最近的怪
{
float Min = 100000;
int index = -1;
for (int i = 0; i < monsterList.Count; i++)
{
float tmpDis = Vector3.Distance(tower.transform.position, monsterList[i].transform.position);
if(Min > tmpDis)
{
Min = tmpDis;
index = i;
}
}
if (index != -1)
{
return monsterList[index];
}
else
return null;
}
炮塔脚本:
void ShowOrHide() //火花显示
{
if (fire.activeSelf)
{
fire.SetActive(false);
}
else
{
GameObject tmpObj = MonsterManageTest.Instance.FindCloest(transform);
if(tmpObj != null)
{
float tmpDis = Vector3.Distance(transform.position, tmpObj.transform.position);
Debug.Log("tmpDis == " + tmpDis);
if (tmpDis < 20)
{
target = tmpObj.transform;
GenBullet();
}
fire.SetActive(true);
}
}
}
怪死亡 利用 MVC 思路
public class MonsterM
{
public float Blood = 100;
public float getBlood()
{
return Blood;
}
}
Animator myAnimator;
MonsterM monster;
// Start is called before the first frame update
void Start()
{
monster = new MonsterM();
myAnimator = gameObject.GetComponent<Animator>();
myAnimator.SetBool("Dead", false);
}
private void OnTriggerEnter(Collider other)
{
monster.Blood -= 10;
Debug.Log("monster.bloodCount == " + monster.Blood);
if (monster.getBlood() <= 0)
{
GameObject.Destroy(gameObject);
}
}
private void OnDestroy()
{
myAnimator.SetBool("Dead", true);
MonsterManageTest.Instance.Remove(gameObject);
}