1:添加unity自带的第一人称角色控制器,命名为hreo

2:添加第三人称角色控制器。这里是添加源文件Sources下面的。如箭头指示:而不是“3rd Person Controller”。并命名为NPC。并设置预设,和加上BOX碰撞器。产生多个NPC。结构图:

3:修改hreo自带的Mouse Look脚本

 using UnityEngine;
using System.Collections; /// MouseLook rotates the transform based on the mouse delta.
/// Minimum and Maximum values can be used to constrain the possible rotation /// To make an FPS style character:
/// - Create a capsule.
/// - Add the MouseLook script to the capsule.
/// -> Set the mouse look to use LookX. (You want to only turn character but not tilt it)
/// - Add FPSInputController script to the capsule
/// -> A CharacterMotor and a CharacterController component will be automatically added. /// - Create a camera. Make the camera a child of the capsule. Reset it's transform.
/// - Add a MouseLook script to the camera.
/// -> Set the mouse look to use LookY. (You want the camera to tilt up and down like a head. The character already turns.)
[AddComponentMenu("Camera-Control/Mouse Look")]
public class MouseLook : MonoBehaviour { public enum RotationAxes { MouseXAndY = , MouseX = , MouseY = }
public RotationAxes axes = RotationAxes.MouseXAndY;
public float sensitivityX = 15F;
public float sensitivityY = 15F; public float minimumX = -360F;
public float maximumX = 360F; public float minimumY = -60F;
public float maximumY = 60F; float rotationY = 0F; //鼠标准心
public Texture2D tex_fire; void Update ()
{
if (axes == RotationAxes.MouseXAndY)
{
//float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX; //rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
//rotationY = Mathf.Clamp (rotationY, minimumY, maximumY); //transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
}
else if (axes == RotationAxes.MouseX)
{
transform.Rotate(, Input.GetAxis("Mouse X") , );
}
else
{
//rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
//rotationY = Mathf.Clamp (rotationY, minimumY, maximumY); transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, );
}
} void OnGUI()
{
if (tex_fire)
{
//绘制鼠标准心
float x = Input.mousePosition.x - tex_fire.width / ;
float y = Screen.height - Input.mousePosition.y - tex_fire.height / ; GUI.DrawTexture(new Rect(x, y, tex_fire.width, tex_fire.height), tex_fire);
}
} void Start ()
{
// Make the rigid body not change rotation
if (GetComponent<Rigidbody>())
GetComponent<Rigidbody>().freezeRotation = true; //取消鼠标默认状态
Screen.showCursor = false;
}
}

5 :编写脚本命名为dr.cs绑定到NPC上

 using UnityEngine;
using System.Collections; public class dr : MonoBehaviour
{ //是否绘制敌人血条
bool showBlood = false;
//血条资源贴图
public Texture2D tex_red;
public Texture2D tex_black;
//生命值
private int HP = ;
//主角对象
private GameObject hero;
// Use this for initialization
void Start()
{
hero = GameObject.Find("Hero");
} // Update is called once per frame
void Update()
{
//设置始终朝向
transform.LookAt(hero.transform);
} void OnGUI()
{
if (showBlood)
{
//绘制敌人血条
int blood_widht = tex_red.width * HP / ;
GUI.DrawTexture(new Rect(, , tex_black.width, tex_black.height), tex_black);
GUI.DrawTexture(new Rect(, , blood_widht, tex_red.height), tex_red);
}
} /// <summary>
/// 当鼠标在GUIElement(GUI元素)或Collider(碰撞体)上点击时调用OnMouseDown。
/// </summary>
void OnMouseDown()
{
//敌人击中目标
if (HP > )
{
//减血
HP -= ;
//击打回馈
}
}
/// <summary>
/// 当用户释放鼠标按钮时调用OnMouseUp。
/// </summary>
void OnMouseUp()
{
//击打敌人后移动一段距离
transform.Translate(Vector3.back * 0.1f);
}
/// <summary>
/// 当鼠标悬浮在GUIElement(GUI元素)或Collider(碰撞体)上时调用 OnMouseOver 。
/// </summary>
void OnMouseOver()
{
//当对着敌人时,开始绘制血条,即显示敌人当前的血条
showBlood = true; }
/// <summary>
/// 当Collider(碰撞体)停止触发trigger(触发器)时调用OnTriggerExit。
/// </summary>
void OnMouseExit()
{
//结束绘制血条
showBlood = false;
}
}

7:dr.cs脚本实现了。当鼠标指向敌人时,显示敌人当前的血条情况,

当击中敌人时候。敌人会后退几步。

dr.cs脚本升级:敌人AI即人工智能

 实现功能:让NPC有自己的生命周期:就是自己巡逻。当在巡逻范围内看到hero,即跑向hero开始攻击(这里暂为实现)

 using UnityEngine;
using System.Collections; public class drAI : MonoBehaviour
{ //敌人状态 //敌人站立状态
public const int STATE_STAND = ;
//敌人行走状态
public const int STATE_WALK = ;
//敌人奔跑状态
public const int STATE_RUN = ;
//记录敌人的当前状态
private int enemyState;
//主角对象
private GameObject hero;
//备份上一次的敌人思考时间
private float backUptime;
//敌人思考下一次行为的时间
public const int AI_THINK_TIME = ;
//敌人的巡逻范围
public const int AI_ATTACK_DISTANCE = ; // Use this for initialization
void Start()
{
//得到主角对象
hero = GameObject.Find("/Hero");
//设置敌人的默认状态为站立
enemyState = STATE_WALK;
} // Update is called once per frame
void Update()
{
//判断敌人与主角的距离 当在巡逻范围内
if (Vector3.Distance(transform.position, hero.transform.position) < AI_ATTACK_DISTANCE)
{
//敌人进入奔跑状态
gameObject.animation.Play("run");
enemyState = STATE_RUN;
//设置敌人面朝主角方向
transform.LookAt(hero.transform);
}
//敌人进入巡逻状态
else
{
//计算敌人的思考时间
if (Time.time - backUptime >= AI_THINK_TIME)
{
//敌人开始思考
backUptime = Time.time;
//取得0~2之间的随机数
int rand = Random.Range(, );
if (rand == )
{
//敌人进入站立状态
gameObject.animation.Play("idle");
enemyState = STATE_STAND;
}
else if (rand == )
{
//敌人进入行走状态
//敌人随机旋转角度
Quaternion rotate = Quaternion.Euler(, Random.Range(, ) * , );
//1秒内完成敌人旋转
transform.rotation = Quaternion.Slerp(transform.rotation, rotate, Time.deltaTime * );
//播放行走动画
gameObject.animation.Play("walk");
enemyState = STATE_WALK;
}
}
}
switch (enemyState)
{
case STATE_STAND: break;
case STATE_WALK:
//敌人行走
transform.Translate(Vector3.forward * Time.deltaTime);
break;
case STATE_RUN:
//敌人朝向主角奔跑
if (Vector3.Distance(transform.position, hero.transform.position) > )
{
transform.Translate(Vector3.forward * Time.deltaTime * );
}
break;
default:
break;
}
}
}

 知识点:

    Quaternion四元素表示旋转。Quaternion.Euler()方法返回一个旋转的四元素。该方法参数表示旋转的三维角度。执行该方法后,将

四元素赋值给一个对象的旋转变量

transform.rotation = rotate

即可在一帧内完成旋转,若想在一段时间内完成旋转,就需要用到
Quaternion.Slerp()方法:
第一个参数表示模型旋转的起始角度
第二参数表示模型的结束角度
第三个参数表示旋转消耗的时间

unity3d-游戏实战突出重围,第四天 添加角色的更多相关文章

  1. Unity3D游戏开发和网络游戏实战书籍及配套资源和一些视频教程分享

    目录 1. 按 2. pdf 3. 配套资源 3.1. Unity网络游戏实战第二版 3.2. Unity网络游戏实战第一版 4. 视频教程 5. 更多坦克大战代码 1. 按 本文主要分享了: Uni ...

  2. Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

    提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...

  3. Unity3D项目实战笔记(5):延时功能的几种实现

    我所做过的系统,分单机版系统(2005年).CS系统(2010年).实时系统(2015年),各个系统均有“延时”功能:定时调度的: 本博客说的是实时系统中的延时功能(基于Unity3D游戏引擎). 在 ...

  4. [Unity3D]Unity3D游戏开发之飞机大战项目解说

    大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...

  5. [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)

    ---------------------------------------------------------------------------------------------------- ...

  6. [整理]Unity3D游戏开发之Lua

    原文1:[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我地博客地址是blog.csdn.net/qinyuanpei.如果 ...

  7. [转载]Unity3D游戏引擎最详尽基础教程

    原文地址:Unity3D游戏引擎最详尽基础教程作者:ShangShang 我一直向所有想做游戏的朋友推荐Unity3D,为什么呢?首先是因为专业,Unity3D非常强大,用它创建一个类似MiniGor ...

  8. Unity3D游戏开发之SQLite让数据库开发更简单

    各位朋友大家好.欢迎大家关注我的博客,我是秦元培,我是博客地址是http://blog.csdn.net/qinyuanpei.在经历了一段时间的忙碌后,博主最终有时间来研究新的东西啦,今天博客向和大 ...

  9. Unity3D游戏轻量级xlua热修复框架

    Unity3D游戏轻量级xlua热修复框架   一 这是什么东西 前阵子刚刚集成xlua到项目,目的只有一个:对线上游戏C#逻辑有Bug的地方执行修复,通过考察xlua和tolua,最终选择了xlua ...

随机推荐

  1. 解决GP服务产生的结果无法自动发布为地图服务的问题

    在ArcGIS for Javascript API或REST API调用GP服务时,常常会遇到这样一种情况:GP服务运行以后,执行成功,也能够生成结果,然而结果并没有直接产生动态的地图服务供API调 ...

  2. [administrative][CentOS][NetworkManager] networkmanager (二)

    [administrative][CentOS][NetworkManager] 万恶的NetworkManager到底怎么用 工程文档: https://wiki.gnome.org/Project ...

  3. 分析占用了大量 CPU 处理时间的是Java 进程中哪个线程

    下面是详细步骤: 1. 首先确定进程的 ID ,可以使用 jps -v 或者 top 命令直接查看 2. 查看该进程中哪个线程占用大量 CPU,执行 top -H -p [PID] 结果如下: 可以发 ...

  4. elastic客户端TransportClient的使用

    关于TransportClient,elastic计划在Elasticsearch 7.0中弃用TransportClient,并在8.0中完全删除它.后面,应该使用Java高级REST客户端,它执行 ...

  5. Anaconda 虚拟环境安装及应用

    首先要安装Anaconda 下载网址:https://www.anaconda.com/distribution/#download-section      Miniconda下载网址:https: ...

  6. pacakge-info.java

    翻看以前的笔记,看到一个特殊的java文件:pacakge-info.java,虽然有记录,但是不全,就尝试着追踪一下该问题, 分享一下流水账式的结果. 首先,它不能随便被创建.在Eclipse中, ...

  7. EXPLAIN执行计划中要重点关注哪些要素(叶金荣)

    原文:http://mp.weixin.qq.com/s/CDKN_nPcIjzA_U5-xwAE5w 导读 EXPLAIN的结果中,有哪些关键信息值得注意呢? MySQL的EXPLAIN当然和ORA ...

  8. Linux下安装jdk1.7

    Linux下安装jdk1.7 1.进入 /usr/local下创建一个文件夹software,用来存放安装包. [root@192 ~]# cd /usr/local/ 2.创建文件夹 [root@1 ...

  9. 1-2-编译U-boot

    1-2-编译U-boot 1.su+enter进入超级用户模式. 2.cd /mnt/+两次Tab去到根目录,ls显示共享文件夹里的文件. 3.解压tar xvfj uboot_TQ210_1.3.4 ...

  10. cd 命令

    [root@localhost ~]# cd # 进入当前用户的家目录 [root@localhost ~]# cd ~ # 进入当前用户的家目录 [root@localhost ~]# cd /da ...