用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;
			}
		}
}




spring面试题 对DI , AOP概念的理解

强调在回答的时候不要光回答概念,要思维扩散性的讲些相关的东西  spring 的优点?  1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦  2.可以使用容易提供的众多服务,如事务管理...
  • GoOnDrift
  • GoOnDrift
  • 2015年01月29日 11:10
  • 1977

Java面试题集(七)--Spring常见面试问题

以下为spring常见面试问题: 1、什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。 Spr...
  • u014079773
  • u014079773
  • 2016年09月06日 20:21
  • 19042

Web前端面试指导(三十一):谈谈你对this的理解

题目点评 主要考察你对面向对象编程的理解,特别是对象的指向问题,如果连对象的指向都搞不清楚,很难说明你是一个优秀的前端开发人员,所以回答this的知识点是体现你的身价的时候到来了!如果能够回答好这个问...
  • lxcao
  • lxcao
  • 2016年10月07日 17:28
  • 4604

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

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

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

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

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

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

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

用了.Net工具来写程序的人,不难发现它有个好处,就是使用的内存不用释放,尤其在使用C#或者VB.Net来写程序,因为程序所占用的内存都是受系统托管的,因此内存的释放不需要程序员去操心。   ...
  • lysc_forever
  • lysc_forever
  • 2013年12月21日 21:31
  • 541

再谈让C++更像C#:C#内存泄露问题

再谈让C++更像C#:C#内存泄露问题 2009-11-16  来自:新浪博客  字体大小:【大 中 小】 摘要:前段时间写了一篇日志叫《让C++更像C#》,本文解决了一个重要的遗留问题:C#内...
  • lphbtm
  • lphbtm
  • 2016年06月24日 17:04
  • 278

C#问题记事本

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

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

  • 2013年08月22日 11:08
  • 31KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C#来谈关于朝向问题
举报原因:
原因补充:

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