基于PF规则的CRPG制作尝试(十三)仇恨判定

编程入门 行业动态 更新时间:2024-10-26 06:37:27

基于PF<a href=https://www.elefans.com/category/jswz/34/1771204.html style=规则的CRPG制作尝试(十三)仇恨判定"/>

基于PF规则的CRPG制作尝试(十三)仇恨判定

基于PF规则的CRPG制作尝试(十三)仇恨判定

本来其实想做很复杂的ai机制,但其实平时跑团的时候遇到的高智力的怪也并不多(主要还是太懒),于是决定从距离和受到伤害两部分来决定仇恨。

首先将场景中的相对怪来说是敌人的gameobject.name(标签为player)存入arraylist中。代码如下:

ArrayList character = new ArrayList();
public int enemynum = 0;
void Start(){var all = Resources.FindObjectsOfTypeAll(typeof(GameObject)) as GameObject[];foreach (var item in all){if (item.scene.isLoaded && (item.tag == "player") && item.activeInHierarchy == true){enemynum++;character.Add(item.name);}}}

然后输入namelist,初始化distancelist(距离数组)和damagecount(受到伤害累计数组),这里面damgecount选用list而非arraylist的原因在于list可以使用确定的变量类型,arraylist只能用object类型,在网上查找后没有找到int类型转换为object类型的方法。

    public ArrayList namelist = new ArrayList();ArrayList distancelist = new ArrayList();public List<int> damagecount = new List<int>();void Start(){enemyinput();}public void enemyinput(){if (enemynum == 1)Enemy = GameObject.Find(character[0].ToString());else{for (int i = 0; i < enemynum; i++){GameObject a = GameObject.Find(character[i].ToString());namelist.Add(a.name);distancelist.Add(0);damagecount.Add(0);}}}

计算敌我距离并添加到distancelist中。如果受到伤害列表全为0就仅按距离排序,MonsterAI部分的具体代码如下:

void Update(){//PrintArray(character);//print(enemynum + "enemynumber");PrintArray(namelist);if (gm.gamestate == gameObject.name){for (int i = 0; i < enemynum; i++){GameObject a = GameObject.Find(namelist[i].ToString());distancelist[i] = distancecheck(a);}if (enemynum != 1)enemycheck();}public float distancecheck(GameObject a){float dis = Vector2.Distance(new Vector2(transform.position.x, transform.position.z), new Vector2(a.transform.position.x, a.transform.position.z));return dis;}void enemycheck(){int x = 1;for (int k = 0; k < enemynum; k++){if (damagecount[k] != 0)x = 0;              }if (x == 1){print("未受到伤害,仇恨仅与距离有关");for (int i = 0; i < enemynum - 1; i++){for (int j = 0; j < enemynum - 1 - i; j++){if ((float)distancelist[j] > (float)distancelist[j + 1]){object m = distancelist[j];object n = namelist[j];distancelist[j] = distancelist[j + 1];namelist[j] = namelist[j + 1];distancelist[j + 1] = m;namelist[j + 1] = n;}}}}else{print("按受到的伤害判定仇恨对象");for (int i = 0; i < enemynum - 1; i++){for (int j = 0; j < enemynum - 1 - i; j++){if ((int)damagecount[j] < (int)damagecount[j + 1]){int m = damagecount[j];object n = namelist[j];damagecount[j] = damagecount[j + 1];namelist[j] = namelist[j + 1];damagecount[j + 1] = m;namelist[j + 1] = n;}if((int)damagecount[j] == (int)damagecount[j + 1]){if ((float)distancelist[j] > (float)distancelist[j + 1]){object m = distancelist[j];object n = namelist[j];distancelist[j] = distancelist[j + 1];namelist[j] = namelist[j + 1];distancelist[j + 1] = m;namelist[j + 1] = n;}}}}}Enemy = GameObject.Find(namelist[0].ToString());}

ActorController中角色造成伤害的部分的代码如下:

if (state == STATE.ATTACK){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit) && hit.transform.gameObject.tag == "monster"){//角色方向的切换ActorTrans.LookAt(hit.transform.position);//如果武器是大剑类if (Weapon.tag == "sword" && monsterdis <= 1.66){Invoke("Hitrec", 0.5f);anim.SetTrigger("attack");//roll攻击检定int ar = Attackroll();//破防if (ar >= hit.transform.gameObject.GetComponent<MonsterData>().AC){int dam = Damage();print(gameObject.name + " 攻击了" + hit.transform.name + " 攻击检定结果为" + ar + " 造成了" + dam + "点伤害");int mynum = 0;for (int i = 0; i < target.GetComponent<MonsterAI>().enemynum; i++){if (hit.transform.gameObject.GetComponent<MonsterAI>().namelist[i].ToString() == transform.name)mynum = i;}hit.transform.gameObject.GetComponent<MonsterAI>().damagecount[mynum] += dam;}//未破防elseprint(gameObject.name + " 攻击了" + hit.transform.name + "未破防 攻击检定结果为" + ar);}}}

更多推荐

基于PF规则的CRPG制作尝试(十三)仇恨判定

本文发布于:2024-02-11 04:01:31,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1679023.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:规则   PF   CRPG

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!