Unity 3 d 2017.3 AI(1)簡単な小兵
4008 ワード
PS:この文章があなたを助けたと思ったら、私を押してください.
これは簡単な小兵のAIで、2つのモードを備えていて、1つは手動モードで、2点を指定して小兵をパトロールさせることができて、自動モードを採用することができて、小兵は自分で移動することができて、攻撃と移動の2つの状態があって、状態機あるいは行為木を使用していません.簡単すぎるので、そんなに複雑な論理は必要ありません.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyAI : MonoBehaviour
{
//
public enum EnemyType
{
Drill,//
Flame,//
Chainsaw,//
}
//
public enum EnemyPattern
{
AT,//
MT,//
}
public GameObject Enemy;// Enemy
public GameObject Player;//
public EnemyType ChooseEnemyType;//
public EnemyPattern ChooseEnemyPattern;//
public Transform PatrolA;//Enemy A
public Transform PatrolB;//Enemy B
public GameObject LaserTX;// Enemy
public float EnemyAttackRange = 5;//Enemy
public float EnemyMoveSpeed = 1;//
public float EnemyRotateSpeed = 10;//
public int ATInterval = 500;// 500
private Vector3 InitialPosition;//Enemy
private float Dis;//Enemy
private Vector3 target;//Enemy
private bool ATswitch = true;//AT
private float EnemyRotateY = 0.1f;//AT
private int My_Time = 0;//
// Use this for initialization
void Start()
{
// Enemy
InitialPosition = Enemy.transform.position;
//
target = PatrolA.position;
transform.LookAt(target);
}
// Update is called once per frame
void Update()
{
// Enemy
Dis = Vector3.Distance(Enemy.transform.position, Player.transform.position);
if (ChooseEnemyPattern == EnemyPattern.MT)//
{
// Enemy
if (EnemyAttackRange > Dis)
{
EnemyAttack();//
}
else
{
MTEnemyPatrol();//
}
}
else if (ChooseEnemyPattern == EnemyPattern.AT)//
{
if (EnemyAttackRange > Dis)//
{
EnemyAttack();
}
else//
{
ATEnemyMove();//
}
}
}
//Enemy
void EnemyAttack()
{
//Enemy
Enemy.transform.LookAt(Player.transform);
//
LaserTX.SetActive(true);
}
//Enemy MT
void MTEnemyPatrol()
{
//
LaserTX.SetActive(false);
//Enemy
Enemy.transform.LookAt(target);
// Enemy 0.2
if (Vector3.Distance(Enemy.transform.position, target) <= 0.2f)
{
if (target == PatrolA.position)// Enemy target
{
target = PatrolB.position;
}
else
{
target = PatrolA.position;
}
//Enemy
Enemy.transform.LookAt(target);
}
//Enemy speed
transform.Translate(Vector3.forward * Time.deltaTime * EnemyMoveSpeed);
}
//Enemy
void ATEnemyMove()
{
My_Time++;//
//
LaserTX.SetActive(false);
if (My_Time > ATInterval)//
{
if (ATswitch)
{
ATswitch = false;
My_Time = 0;
}
else
{
ATswitch = true;
My_Time = 0;
EnemyRotateY = Random.Range(-0.1f, 0.1f);//
}
}
if (ATswitch)
{
//
transform.Rotate(0, EnemyRotateY, 0);
}
else
{
//
transform.Translate(Vector3.forward * Time.deltaTime * EnemyMoveSpeed);
}
}
}
これは簡単な小兵のAIで、2つのモードを備えていて、1つは手動モードで、2点を指定して小兵をパトロールさせることができて、自動モードを採用することができて、小兵は自分で移動することができて、攻撃と移動の2つの状態があって、状態機あるいは行為木を使用していません.簡単すぎるので、そんなに複雑な論理は必要ありません.