unity3d-代码控制游戏角色控制器移动
先上一个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-代码控制游戏角色控制器移动的更多相关文章
- Unity3D 之3D游戏角色控制器运动
3D运动,绑定了人形控制器后的一个简单的运动方法. using UnityEngine; using System.Collections; public class PlayerMove : Mon ...
- [转]iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法
参考:http://www.mamicode.com/info-detail-469709.html 一.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能( ...
- iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法
.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能(ipad我不了解除外,这里只说iPhone),这个方法是所有视图控制器对象都可以用的,而实现这种功能,有 ...
- Unity 代码控制游戏对象是父物体的第多少个子对象
一个canvas下的游戏对象,排列顺序越往下,渲染顺序就越靠后,就会覆盖在先前的图形上.也就是说,运行游戏后,物体的渲染顺序是一个一个计算的. Transform.SetSiblingIndex(in ...
- 游戏开发之在UE4中编写C++代码控制角色
当你运行我们上次做完的项目,你可能会意识到我们移动的摄像机还是默认的那个摄像机,这个默认的摄像机可以自由飞翔.这一节,我们要使得开始的角色是我们的一个Avatar类的实例对象,并且使用键盘控制我们的角 ...
- unity3d角色控制器01
参考出处貌似是雨松大神.如有侵权,立即删除. 需要导入包 ①将FirstPerson Controller拖拽入Hierarchy(层次视图)中.由于角色控制器是具有一定物理引擎的,所以一定要将它放在 ...
- 关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器
对于多量的.复杂的.有规律的控制器使用代码生成 动画状态代码控制 1:每个动画状态,比如进入状态,离开状态, 等都有可能需要代码来参与和处理,比如,进入这个动画单元后做哪些事情,来开这个动画单元后做哪 ...
- [原]Unity3D深入浅出 - 角色控制器(Character Controller)
角色控制器主要用于第一人称和第三人称主角的控制,并不使用刚体物理效果. 添加角色控制器的方法:依次打开菜单栏中的Component - Physiscs - Character Controller ...
- Unity3D笔记 英保通六 角色控制器
一.角色控制器 U3D有两种角色控制方式:Rigidbody刚体.角色控制器组件(胶囊体组件) 面试的题目中经常会遇到这个问题: CharacterController和Rigidbody的区别? 这 ...
随机推荐
- LeetCode 155 - 最小栈 - [数组模拟栈]
题目链接:https://leetcode-cn.com/problems/min-stack/description/ 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的 ...
- [No0000189]改善C#程序的建议10:用Parallel简化Task
在命名空间System.Threading.Tasks下,有一个静态类Parallel简化了在同步状态下的Task的操作.Parallel主要提供了3个有用的方法:For.ForEach.Invoke ...
- Exception 04 : java.lang.ClassNotFoundException: Could not load requested class : org.hsqldb.jdbcDriver
异常详细信息 org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [org ...
- [development][tcp/ip][ids] 一个简单有参考价值的库 libnids
libhtp 中的例子, 可以通过libnids快速使用. 或者可以快速的写个sniffer. 支持三个功能 ip分片重组, tcp乱序重排, 端口扫描发现. 工程: https://github.c ...
- [security] security engine things
1. luarock luarock 之于 lua,就好比 pip 之于 python https://luarocks.org/ 2. lua的库 [root@base package]# ls ...
- odoo权限管理
Odoo的权限的核心是权限组(res_groups).对每个权限组,可以设置权限组的菜单表示,对象表示,记录规则表示,字段表示. 1.菜单/对象级别 设置哪些人可以访问哪些菜单/对象,对象的访问权限包 ...
- jquery-- json字符串没有自动包装为 json对象
jquery 的一个坑 页面使用 ajax ,回调函数中获取后端返回的 json 格式数据(ajax 未显式指定返回值类型),后端controller方法标注 @ResponseBody 并返回一个 ...
- 洛谷P2747周游加拿大Canada Tour [USACO5.4] dp
正解:dp 解题报告: 传送门! 其实这题是我做网络流的时候发现了这题,感觉有点像双倍经验,,,? 但是我还不想写网络流的题解,,,因为网络流24题都还麻油做完,,,想着全做完了再写个总的题解什么的( ...
- CentOS安装HBase
1.下载HBASE http://www.apache.org/dyn/closer.cgi/hbase/ 2.解压文件到安装目录 #mkdir hbase #cd hbase #tar -zxvf ...
- WARNING: firstResult/maxResults specified with collection fetch; applying in memory!
QueryTranslatorImpl @Override public List list(SessionImplementor session, QueryParameters queryPara ...