用C#来谈关于朝向问题
2015-07-07 17:14
513 查看
这是一篇关于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#接口与抽象类小结
- C#使用xpath找到一个节点
- C# 开发积累(1)
- C# 代码执行效率
- [深入学习C#]C#实现多线程的方式:Task——任务
- C#语言基础之运算符
- C#语言基础之转义字符、变量、常量、类型转换
- c# tabcontrol控件标签如何隐藏?
- csharp: DataTable Rename ColumnName and remove Column
- C#语言基础之数据类型
- 【protobuf】 3.使用protobuf-csharp-port进行序列化和反序列化
- c#语言基础之组成结构
- C#中Timer使用及解决重入问题
- Hough线变换
- C#自适应合并文件的方法
- C#第七次作业:学习总结
- C# .ToString() 格式化
- C#第六次作业:猜猜看
- Canny 边缘检测 (Emgu.CV)
- C#学习笔记(六):可空类型、匿名方法和迭代器