先上一个gif看看效果。因为图片大小限制。所以录制的比较小。个人认为效果比较牵强。特别是里面的逻辑代码。 不过我还是认为一切是为了先实现,因为我是刚接触的新手。

工程结构图

这次实现的效果是:

1:摄像机跟着角色移动,上篇博客说的是。把摄像机变成角色的子对象。发现没有我想要的效果。跟着角色移动代码是我自己弄出来的。不知道实际项目中是否也是这样。

2:利用角色控制器组建 CharacterController 实现角色移动。

3:当鼠左键击地形,角色自动寻路。今天发现用unity3d有自带的NavMesh实现自带寻路,不过还没去研究。

4:当鼠左键点击地形。实现一个高亮效果。

5:鼠标右键单击播放杀怪动画。

6:到达关卡场景,进入下一关。本来是想杀boss后在进入,但血条不会弄。

..............

Hierarchy视图中元素。分别是:主摄像机,平行光,地形,墙(也就是我这里的关卡),无效的元素,当前角色,鼠标点击显示图片,boss

加载场景的时候。需要把加载的场景Build进去

最后看看实现代码 ,有点牵强。也写了很多注释。方便大家和自己以后查看。

 using UnityEngine;
using System.Collections; public class chartMove : MonoBehaviour
{ public float speed = 5f;
public GameObject cursor;//鼠标点击光标显示图片
public GameObject boos; //boos对象 private Vector3 targetPos; //目标位置
private Vector3 mousePos; //鼠标单击的位置
private Vector3 beforePos;//角色移动前的位置
private CharacterController charController = null;
private bool cursorState = false; //当前是否点击了鼠标
private bool BossIsDie;//bos是否over // Use this for initialization
void Start()
{
charController = GetComponent<CharacterController>();
targetPos = transform.position;
mousePos = transform.position;
} // Update is called once per frame
void Update()
{
beforePos = transform.position; //保存当前的位置 //获取按键轴
/*
* Horizontal-->对应键盘上上的A,D
* Vertical-->对应键盘上上的W,S
* 当没有按键的时候为0 。
* 其值分别为 -1(左,下) 0 1(上。右)
*/
float x = Input.GetAxis("Horizontal");
float y = Input.GetAxis("Vertical"); //transform.Translate(new Vector3(x, 0, y) * Time.deltaTime * speed,Space.World); //if (x == 0 && y == 0 && !cursorState)
//{
// transform.animation.Play("idle");
//}
if (x != || y != )
{
transform.animation.Play("run"); //奔跑
cursor.SetActive(false);
//charController.Move(new Vector3(x, 0, y) * Time.deltaTime * speed);
//transform.Translate(new Vector3(x, 0, y) * Time.deltaTime * speed, Space.World);
cursorState = false;
charController.SimpleMove(new Vector3(x, , y) * speed); //设置角色面朝的方向
Vector3 lookPos = transform.position - beforePos + transform.position;
transform.LookAt(lookPos);
}
else
{ } //左键选择路径
if (Input.GetMouseButtonDown())
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, )) //100为射线的长度,限制用户瞎点击。在100以为点击无效
{
if (hit.collider.name == "Terrain")
{
mousePos = hit.point;
Vector3 lookPos = mousePos - transform.position + transform.position;
transform.LookAt(lookPos);
cursor.SetActive(true); //显示图片:图片一开始是隐藏的。
cursor.transform.position = mousePos;
cursorState = true;
}
}
} //判断角色是否到达目的地
int distance = (int)Vector3.Distance(mousePos, transform.position); //这个1.08的临界值。我是根据调试得来的。具体为什么是1.08,暂时还不知道
if (distance > 1.08f && cursorState)
{
transform.animation.Play("run"); //奔跑 //控制向量长度在 speed 范围在内
Vector3 setp = Vector3.ClampMagnitude(mousePos - transform.position, speed);
//charController.Move(setp*0.3f); //开始我用这个方法。不是我想要的效果
/*
这里要区别于:Move() 一个更加复杂的运动函数,每次都绝对运动
* SimpleMove:以一定的速度移动角色
*/
//cursorState = false;
charController.SimpleMove(setp); }
else
{
if (x == && y == )
{
//transform.animation.Play("idle");
cursor.SetActive(false);
//cursorState = false;
if (!transform.animation.IsPlaying("attack"))//当前没有攻击
transform.animation.Play("idle");
}
//transform.animation.Play("idle");
}
//右键攻击
/*
GetMouseButton:按下不弹起就一直执行
* GetMouseButtonDown:按下执行一次。
*
*/
if (Input.GetMouseButton())
{
cursorState = true;
transform.animation.Play("attack");//攻击
}
//transform.animation.Play("run"); //奔跑
//设置角色面朝的方向
//Vector3 lookPos = transform.position - beforePos + transform.position;
//transform.LookAt(lookPos); //设置相机跟随
Vector3 camera = Camera.main.transform.position; //获取主相机的位置
Vector3 currChart = transform.position;//当前角色位置 camera.x = currChart.x;
camera.y = currChart.y + ;
camera.z = currChart.z - ; Camera.main.transform.position = camera; //if ((charController.collisionFlags & CollisionFlags.Above) != 0)
// print("touched the ceiling"); }
/// <summary>
/// 当控制器碰撞一个正在运动的碰撞器时,OnControllerColliderHit 被调用。
/// </summary>
/// <param name="hit"></param>
public void OnControllerColliderHit(ControllerColliderHit hit)
{ //如果碰到的是墙并且boos is die,进入下一关,这里 墙 代替关卡
if (hit.transform.name == "wall")
{
//加载关卡,2 表示Build Settings中场景的索引
Application.LoadLevel();
}
} public void OnTriggerEnter(Collider other)
{ } }

下一篇想弄动画的剪切,因为美工给程序的动画是一个总体。我们需要把某一个动作。比如蹦跑,杀怪等单个动画弄出来播放,就像上面的

transform.animation.Play("attack");//攻击

unity3d-代码控制游戏角色控制器移动的更多相关文章

  1. Unity3D 之3D游戏角色控制器运动

    3D运动,绑定了人形控制器后的一个简单的运动方法. using UnityEngine; using System.Collections; public class PlayerMove : Mon ...

  2. [转]iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法

    参考:http://www.mamicode.com/info-detail-469709.html 一.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能( ...

  3. iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法

    .最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能(ipad我不了解除外,这里只说iPhone),这个方法是所有视图控制器对象都可以用的,而实现这种功能,有 ...

  4. Unity 代码控制游戏对象是父物体的第多少个子对象

    一个canvas下的游戏对象,排列顺序越往下,渲染顺序就越靠后,就会覆盖在先前的图形上.也就是说,运行游戏后,物体的渲染顺序是一个一个计算的. Transform.SetSiblingIndex(in ...

  5. 游戏开发之在UE4中编写C++代码控制角色

    当你运行我们上次做完的项目,你可能会意识到我们移动的摄像机还是默认的那个摄像机,这个默认的摄像机可以自由飞翔.这一节,我们要使得开始的角色是我们的一个Avatar类的实例对象,并且使用键盘控制我们的角 ...

  6. unity3d角色控制器01

    参考出处貌似是雨松大神.如有侵权,立即删除. 需要导入包 ①将FirstPerson Controller拖拽入Hierarchy(层次视图)中.由于角色控制器是具有一定物理引擎的,所以一定要将它放在 ...

  7. 关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器

    对于多量的.复杂的.有规律的控制器使用代码生成 动画状态代码控制 1:每个动画状态,比如进入状态,离开状态, 等都有可能需要代码来参与和处理,比如,进入这个动画单元后做哪些事情,来开这个动画单元后做哪 ...

  8. [原]Unity3D深入浅出 - 角色控制器(Character Controller)

    角色控制器主要用于第一人称和第三人称主角的控制,并不使用刚体物理效果. 添加角色控制器的方法:依次打开菜单栏中的Component - Physiscs - Character Controller ...

  9. Unity3D笔记 英保通六 角色控制器

    一.角色控制器 U3D有两种角色控制方式:Rigidbody刚体.角色控制器组件(胶囊体组件) 面试的题目中经常会遇到这个问题: CharacterController和Rigidbody的区别? 这 ...

随机推荐

  1. {python之协程}一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二

    python之协程 阅读目录 一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二 一 引子 本 ...

  2. href='#' 和 href='###'

    如果想定义一个空的链接,又不跳转到页面头部,可以写href="###". 详细解释就是'#' 是有特定意义的,如果 '#' 后有内容会被认为是一个标签而从页面找到相应标签跳转到该处 ...

  3. tomcat运行模式

    Tomcat Connector的三种不同的运行模式性能相差很大 这三种模式的不同之处如下: BIO: 一个线程处理一个请求.缺点:并发量高时,线程数较多,浪费资源. Tomcat7或以下,在Linu ...

  4. 【未完待续】API接口

    1.json传输 2.安全:权限  http://blog.csdn.net/linlzk/article/details/50748580. 比如:调用端有userId.psw.version.ti ...

  5. Flink - watermark生成

    参考,Flink - Generating Timestamps / Watermarks watermark,只有在有window的情况下才用到,所以在window operator前加上assig ...

  6. EF-CodeFirst-基础

    什么是Code-First Code-First主要用于领域驱动设计.在Code-First方法中,专注于应用程序的域,先开始为域实体创建类,而不是先设计数据库,然后创建与数据库设计相匹配的类.下图说 ...

  7. idea导出可执行jar包

    一. 在菜单中选择 File->project structure. 二. 在弹出的窗口中左侧选中"Artifacts",点击"+"选择jar,然后选择& ...

  8. Django实现邮件发送功能

    首先申请邮箱并在设置中申请到授权码,授权码的目的仅仅是让你有权限发邮件,但是不能登录到邮箱进行修改,发送邮件时,可以代替密码 1,配置文件settings.py #邮件服务配置文件 EMAIL_USE ...

  9. MUI框架a链接href跳转失效解决方法,解决MUI页面不会滚动的方法

    //解决 所有a标签 导航不能跳转页面 mui('body').on('tap','a',function(){document.location.href=this.href;}); //解决MUI ...

  10. 重读《深入理解Java虚拟机》二、Java如何分配和回收内存?Java垃圾收集器如何工作?

    线程私有的内存区域随用户线程的结束而回收,内存分配编译期已确定,内存分配和回收具有确定性.共享线程随虚拟机的启动.结束而建立和销毁,在运行期进行动态分配.垃圾收集器主要对共享内存区域(堆和方法区)进行 ...