用C#来谈关于朝向问题

原创 2015年07月07日 17:14:50

这是一篇关于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;
			}
		}
}




相关文章推荐

浅谈C#托管程序中的资源释放问题 来源:愚翁

终于开始动手写这篇文章了,有个网友催了我好几次,而我要么因为手头有事,要么就是被其他思路给叉开,以至这篇文章拖了好久还没开始写,今天终于可以静下心来完成它。   用了.Net工具来写程序的人,不难...

浅谈C#托管程序中的资源释放问题

便于对文章的开展,需要先明确两个概念。 第一个就是很多人用.Net写程序,会谈到托管这个概念。那么.Net所指的资源托管到底是什么意思,是相对于所有资源,还是只限于某一方面资源?很多人对此不是很了解...
  • remy303
  • remy303
  • 2012年06月19日 15:09
  • 1220

浅谈C#链接SQL server 数据库问题。

我的第一篇博文,浅谈C#数据库连接。    学习应该有个良好的态度,给自己找了各种理由,从接受数据库任务,学ASP.NET,到做成简单的只含几个表的数据库,经历了两个月,链接数据库也花费一个多月才解决...

蚁群算法解决TSP问题 C#

  • 2015年01月10日 19:58
  • 27KB
  • 下载

C#问题记事本

  • 2014年10月20日 10:11
  • 44KB
  • 下载

C#中字符串中含有\0的问题处理

问题描述 在byte转换为字符串的过程中,如果byte的值为0,则转换成字符串时变为’\0’字符,’\0’字符在C#中意味着字符串结束,如果后面再有字符,则读取字符串的程序也不能读取和显示出来。 ...

C# 导入文件时字符集的处理问题

  • 2013年08月22日 11:08
  • 31KB
  • 下载

C#反射及元数据性能问题

  • 2013年07月27日 17:44
  • 296KB
  • 下载

关于Vs2010 C#使用DirectX的问题

转载的,就不翻译了…微软把精力放到xna去了。所以推荐大家用XNA,如果非要用托管的DirectX也可以,只不过版本一直是2006年的了。 具体方法: 安装SDK之后 他默认的位置在 C:\W...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C#来谈关于朝向问题
举报原因:
原因补充:

(最多只允许输入30个字)