关闭

用C#来谈关于朝向问题

159人阅读 评论(0) 收藏 举报

这是一篇关于Tank炮塔转向问题,当玩家坦克距敌人30米远时炮塔就会自动转向敌人,同时这脚本也可以加在敌人身上

脚本:

using UnityEngine;
using System.Collections;

public enum EnemyTypea
{ //枚举敌人的类型
	Enemy0,
	Enemy1
}

public class enemyMove : MonoBehaviour {

		public EnemyTypea enemType = EnemyTypea.Enemy0;//敌人枚举类型  (策划可选)
		public GameObject player;//<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">游戏对象</span>
		
		private const int EMEMY_NORMAL = 0;//敌人的状态 普通状态
		private const int EMEMY_ROTATTON = 1;//旋转状态
		private const int EMEMY_RUN = 2;//奔跑状态
		private const int EMEMY_CHASE = 3;//追击玩家状态
		private const int EMEMY_ATTACK = 4;//攻击<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">状态</span>
		
		private int state;//记录当前敌人的状态,然后根据不同的类型的敌人播放不同类型的动画
		
		private int rotation_state;//旋转状态敌人自身旋转
		
		private float aiTankLastTime;//记录上次敌人状态
		
		void Start()
		{
			//初始化标志敌人状态 以及动画为循环播放
			state = EMEMY_NORMAL;
//			this.animation.wrapMode = WrapMode.Loop;
		}
		
		
		void Update()
		{
			switch (enemType)
			{ //根据策划选择敌人类型 这里面会进行不同的敌人AI
			case EnemyTypea.Enemy0:
				updateEnemyType0();
				break;
			case EnemyTypea.Enemy1:
				UpdateEnemyType1();
				break;
			}
		}
		void updateEnemyType0()//更新第一种敌人的AI
		{
			// 当<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">与他的距离小于十米时 就会自动朝向主角</span>
			if (Vector3.Distance(player.transform.position, this.transform.position) <= 50)
			{
				this.transform.LookAt(player.transform);
			}
		}
		
		void UpdateEnemyType1()//更新第二种敌人的AI
		{
			if (isAIthank())//判断敌人是否开始思考
			{
				AIthankEnemyState(3);//敌人开始思考
			}
			else
			{
				UpdateEmenyState();//敌人状态更新
			}
		}
		int getRandom(int count)
		{
			return new System.Random().Next(count);
		}
		bool isAIthank()
		{
			if (Time.time - aiTankLastTime >= 3.0f)//这里表示敌人每3秒进行一次思考
			{
				aiTankLastTime = Time.time;
				return true;
			}
			return false;
		}
		
		void AIthankEnemyState(int count)
		{
			int d = getRandom(count);
			switch (d)
			{
			case 0:
				setEmemState(EMEMY_NORMAL);
				break;
			case1:
					setEmemState(EMEMY_ROTATTON);
				break;
			case2:
					setEmemState(EMEMY_RUN);
				break;
			}
		}
		void setEmemState(int newState)
		{
			if (state == newState)
				return;
			state = newState;
			string animName = "idle";
			switch (state)
			{
			case EMEMY_NORMAL:
				animName = "idle";
				break;
			case EMEMY_RUN:
				animName = "run_forward";
				break;
			case EMEMY_ROTATTON:
				animName = "run_forward";
				//当敌人旋转时 开始随机旋转角度系数
				rotation_state = getRandom(4);
				break;
			case EMEMY_CHASE:
				animName = "run_forward";
				//当敌人进入追击状态时 将面朝<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">方向奔跑</span>
				this.transform.LookAt(player.transform);
				break;
			case EMEMY_ATTACK:
				animName = "run_forward";
				//当敌人进入攻击状态时 朝向<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">开始攻击</span>
				this.transform.LookAt(player.transform);
				break;
			}
	/*		if (!this.animation.animation.IsPlaying(animName))//避免重复播放动画  要在这进行一个判断
			{
				this.animation.Play(animName);//播放动画
			}
			*/
		}
		void UpdateEmenyState()
		{        //判断敌人与<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">之间的距离</span>
			float distance = Vector3.Distance(player.transform.position, this.transform.position);
			if (distance <= 10)//当敌人与<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">的距离小于10 敌人将开始面朝主角追击</span>
			{
				if (distance <= 3)
				{
					setEmemState(EMEMY_ATTACK);
				}
				else
				{
					setEmemState(EMEMY_CHASE);//否则敌人将开始面朝<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">追击</span>
				}
			}
			else
			{
				if (state == EMEMY_CHASE || state == EMEMY_ATTACK)//敌人攻击<span style="font-family: Arial, Helvetica, sans-serif;">玩家</span><span style="font-family: Arial, Helvetica, sans-serif;">的时候主角迅速移动 当他们之间的距离大于10的时候敌人将会回到正常状态</span>
				{
					setEmemState(EMEMY_NORMAL);
				}
			}
			switch (state)
			{
			case EMEMY_ROTATTON:
				//旋转状态时 敌人开始旋转 旋转时间为1秒 这样更加具有惯性
				transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, rotation_state * 90, 0), Time.deltaTime * 1);
				break;
			case EMEMY_RUN:
				transform.Translate(Vector3.forward * 0.02f);//奔跑状态时 敌人向前奔跑
				break;
			case EMEMY_CHASE:
				transform.Translate(Vector3.forward * 0.02f);//追击状态时 敌人向前开始追击
				break;
			case EMEMY_ATTACK:
				break;
			}
		}
}




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:7889次
    • 积分:204
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档