• 一、本来打算写UI框架的,不过在那之前我打算在复习一下在UGUI中我认为最重要的知识点--->RectTransorm 二、1.UI是游戏可玩性的核心点之一,相信这是毋庸置疑的,UI元素的外观美术一般可以全权帮程序员解决,但涉及...

    一、本来打算写UI框架的,不过在那之前我打算在复习一下在UGUI中我认为最重要的知识点--->RectTransorm

    二、

    1.UI是游戏可玩性的核心点之一,相信这是毋庸置疑的,UI元素的外观美术一般可以全权帮程序员解决,但涉及到UI元素根据游戏进度

    和可玩性要求的不断升级,需要的操作会越开越复杂,此时对UI元素的位置变换需要应运而生,而RectTrsorm的学习此刻就显得尤为重要

    2.RectTransorm继承自Transorm,其中最为重要的是Anchors和Pivot两部分,其中Anchors称为锚点,它的位置和大小取决于此UI父容器的位置和大小,

    而Pivot被称为中心点,它是此UI图片的中心点。在某些情况下他们俩密不可分,某些情况下又没那么密切。具体如下:


    3.如上图,若锚点聚合为一点T,PosX、PosY为T点到Pivot点的二维向量,当然此向量向左、向上为正,反之为负数。


    4.如上图,如锚点不聚合为一点T时,此时T点的位置据官方文档称是和4个锚点中心和Pivot点之间插值,不过上面的图解

    足够帮助我们理解到一些数据了。

    5.如上的两种情况分析很简易,不过能够帮助到一些初次接触到RectTransorm组件的新人,我也很满足了,毕竟我当时就是一脸懵逼。

    三、关于这个组件的更加详细的学习,若是日后需求更加剧烈时,再来深入探究吧


    展开全文
  • using System.Collections; using System.Collections.Generic; using UnityEngine; public class Move : MonoBehaviour { public float speed = 0.1F; public float rotatespeed = 3.0...private Transform tran; p...

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class Move : MonoBehaviour
    {
    public float speed = 0.1F;
    public float rotatespeed = 3.0f;
    private Transform tran;
    private Animator m_animtor;
    private float h;
    private float v;
    // Use this for initialization
    void Start()
    {
    tran = gameObject.GetComponent();
    m_animtor = GetComponent();
    }

    // Update is called once per frame
    void Update()
    {
        h = Input.GetAxis("Horizontal");
        v = Input.GetAxis("Vertical");
        transform.Rotate(0, h * rotatespeed, 0);
        Vector3 forward = transform.TransformDirection(Vector3.forward);
        float curSpeed = speed * v;
        if (Mathf.Abs(v) > 0.1)
        {
            if (Input.GetKey(KeyCode.W))
            {
                //tran.Translate(Vector3.forward * 0.1f);
                //m_animtor.SetBool("walkone", true);8
                if (Input.GetKey(KeyCode.LeftShift))
                {
                    tran.Translate(Vector3.forward * 0.5f);
                    m_animtor.SetBool("runone", true);
                }
            }
    
            else if (Input.GetKeyUp(KeyCode.LeftShift) || Input.GetKeyUp(KeyCode.W))
            {
    
                m_animtor.SetBool("runone", false);
            }
            //else if (Input.GetKeyUp(KeyCode.W))
            //{
            //    m_animtor.SetBool("walkone", false);
            //}
            
    
        }
    
        if (Input.GetKey(KeyCode.K))
        {
            m_animtor.SetBool("attack", true);
        }
        else if (Input.GetKeyUp(KeyCode.K))
        {
            m_animtor.SetBool("attack", false);
        }
    
    }
    

    }

    展开全文
  • 在开始写飞行器旋转算法之前,我参考了《unity制作简单的太阳系》一文 https://blog.csdn.net/hcud024/article/details/51360068 因为首先我们要做到飞行器正常地旋转即可,这里我们只需要用到tran...

    上周由于中秋节放假,人比较懒散,只是在和同学一起完成了关于飞行器旋转及变轨操作后,便早早地溜回了宿舍,趁着今天下午没课,把上周完成的算法大概介绍一下。

    在开始写飞行器旋转算法之前,我参考了《unity制作简单的太阳系》一文
    https://blog.csdn.net/hcud024/article/details/51360068
    因为首先我们要做到飞行器正常地旋转即可,这里我们只需要用到transform.RotateAround(origin.position, axis, speed * Time.deltaTime)方法即可,其中括号里的三个参数,分别代表着:绕点位置、旋转角度、旋转速度,只需要一个函数即可做到飞行器旋转。

    飞行器旋转轨迹
    然后关于显现飞行器旋转轨迹,我们只需要在unity中设置好 Trail Renderer 组件即可,设置的方法点击 Add Component,输入组件即可。

    飞行器的旋转比较简单,然后关于变轨操作,这里一开始,我也没弄懂思路,一味的用transform.Translate(x,y,z)方法在一帧内实现在固定距离的移动,最后可以做到突然变轨,但这显然并不是飞行器合理的变轨现象,在同学的帮助指导下,才明白了作为所谓的程序员思想,即我们不能简单地考虑一个动作的执行,而要把整个操作过程交给计算机进行重复判断执行过程,一下将展示代码:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Rotation : MonoBehaviour {
        public Transform origin;         //卫星旋转点
        public float speed = 5;         //卫星旋转速度
        public float ry, rz;
        public float distance = 10;        //卫星初始高度
        public float SetDitance = 300;      //变轨后高度
        public float disSpeed = 2;         //变轨速度
        // Use this for initialization
        void Start () {
    
        }
        
        //变轨函数
    	public void OrbitalTransfer(float dispeed){
            transform.Translate(dispeed * Time.deltaTime, 0, 0);  
        }
        
    	// Update is called once per frame
    	void Update () {
            Vector3 axis = new Vector3(0, ry, rz);
            this.transform.RotateAround(origin.position, axis, speed * Time.deltaTime);
            if (distance < SetDitance)
            {
                distance = distance + disSpeed;
                OrbitalTransfer(disSpeed);
             //   speed = speed - 0.001f;              //卫星变轨后,速度减慢
                
    
            }else if(distance > SetDitance)
            {
                distance = distance - disSpeed;
                OrbitalTransfer(-disSpeed);
             //   speed = speed + 0.001f;
                
            }
    
        }
    }
    

    在这里我们主要用到了两个判断,即distance和SetDitance,分别代表着飞行器的目前距离以及变轨距离,我们只需要在每一帧内,让系统判断飞行器此时是否目前距离小于变轨距离,则要进行变轨操作,如果大于,则要返回,从而保证飞行器在每一帧内做到自行判断,而不是仅在一帧内的运动。

    代码中的两个注释是目前还没有解决的问题,即如何实现飞行器变轨后,速度减慢的问题,因为按照正常逻辑,变轨后的飞行器由于万有引力,速度是要变慢的(高中物理,别问为什么),而变慢是个持续的过程,即在变轨的过程中会持续变慢,目前还没有想出比较好的解决方法(求大牛指导)。以下是效果图:
    在这里插入图片描述

    展开全文
  • 首先,在了解了最基础的Unity的概念、操作之后,我们来模拟一个最简单的场景,运用学过的简单的知识。场景是这样子的: 有一扇门,一个学生,学生来到门前,门会自动打开,然后学生进去,门自动关闭。为了完成这个...

    首先,在了解了最基础的Unity的概念、操作之后,我们来模拟一个最简单的场景,运用学过的简单的知识。场景是这样子的:
    有一扇门,一个学生,学生来到门前,门会自动打开,然后学生进去,门自动关闭。

    为了完成这个demo,首先我们能从上面的描述中得到两个主体,Door和Student。然后,注意一下我们需要完成的是需求是学生来到门前,这就意味着我们需要有一个触发器而不能用Door自带的碰撞体。所以,还有一个主体参与Demo,那就是一个触发器,以便于监听触发事件。
    下面来分别说明一下三个主体。

    1、学生(Student)

    这是最简单的主体,我们可以创建一个GameObject,给其添加一个Rigidbody,然后创建一个Script,用刚体组件来控制Student的运动,代码如下:

        private Transform m_Transform;
        private Rigidbody m_Rigidbody;
    
        void Start(){
            m_Transform=gameObject.GetComponent<Transform>();
            m_Rigidbody=gameOnjcet.GetComponent<Rigidbody>();
        }
        //键盘的W、A、S、D分别控制Student的向前、向左、向后、向右移动
        void Update(){
            if(Input.GetKey(KeyCode.W)){
                m_Rigidbody.MovePosition(m_tran.pos+Vec3.for*0.2f);
            }
            if(Input.GetKey(KeyCode.A)){
                m_Rigidbody.MovePosition(m_tran.pos+Vec3.left*0.2f);
            }
            if(Input.GetKey(KeyCode.S)){
                m_Rigidbody.MovePosition(m_tran.pos+Vec3.back*0.2f);
            }
            if(Input.GetKey(KeyCode.D)){
                m_Rigidbody.MovePosition(m_tran.pos+Vec3.right*0.2f);
            }
        }

    2、门(Door)

    门这个物体需要进行的操作就是使用边轴旋转,但是一个物体是不可以移动他的中心点的,所以我们会经常使用在物体外面嵌套一个父物体的方式来实现更改轴线或者中心。注意,我们创建一个空物体之后,需要先将其中心设置在合适的位置,然后再将需要操作的物体拖拽进去。这样在操作父物体实现效果。然后,门的话有两个动作,一个是开,一个是关,代码如下:

    private Transform m_Transform;
    void Start(){
        m_Transform=gameObject.GetComponent<Transform>();
    }
    void Update(){}
    
    //为了使其能在其他Script中调用,需要使用public修饰
    //开门
    public void open(){
        m_Transform.Rotate(Vector3.up,90);//绕y轴旋转90度
    }
    //关门
    public void close(){
        m_Transform.Rotate(Vector3.up,90);//绕y轴反方向旋转90度
    }

    3、触发器(Trigger)

    门的触发器需要根据门的形状和需求进行设计,不再赘述。触发器需要进行的操作有两个,一个是检测Student的触发,一个是使Door进行开关动作。具体操作:创建一个空物体,添加一个Rigidbody和一个Collider,并且勾选“is Trigger”,脚本代码如下:

    private DoorScript door;
    void Start(){
        //找到门,同时找到其脚本组件 Door,这样就可以通过door调用其脚本的方法
        door=GameObject.Find("Door").getComponent<DoorScript>();
    }
    
    //进入触发区域
    void OnTriggerEnter(Collider coll){
        door.open();             //调用开门方法
    }
    //离开触发区域
    void OnTriggerExit(Collider coll){
        door.close();            //调用关门方法
    }

    说实话,这是一个简单到不能再简单额示例,之所写这么繁琐,一来是培养我写博客的好习惯,二来是利用写博客的时间在脑中重新梳理一遍解决问题的步骤,因为如果开发大型项目,分析问题的清晰思路是必不可少的。

    展开全文
  • private void OnAnimatorIK(int layerIndex) { AnimatorStateInfo info = my_ani.GetCurrentAnimatorStateInfo(1); if(info.IsName("r_hand")) { if (Vector3.Angle(tran...
     private void OnAnimatorIK(int layerIndex)
        {
            AnimatorStateInfo info = my_ani.GetCurrentAnimatorStateInfo(1);
            if(info.IsName("r_hand"))
            {
                if (Vector3.Angle(transform.forward, Vector3.zero - transform.position) < 90)
                {
                    my_ani.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);//设置右手权重为1 表示全覆盖
                    my_ani.SetIKPosition(AvatarIKGoal.RightHand, Vector3.zero);//设置右手指向原点
                }
            }
        }

     

    展开全文
  • 最近在帮同事做一点项目。分配给我了人员位置热力图的功能块。其中一块需要时间段的的选取。效果如下: 看到这个瞬间让我想到很久之前画折线图那块,我们通过给Image新的顶点来绘制我们需要的图形。...
  • 最近做的东西需要用圆柱画线,网上找了些,没找到合适的,所以自己简单写了一个。 这个函数只需要输入起始点和终点即可,材质可以自己调整 ... Vector3 rightPosition = (startP.transform.position + finalP.tran...
  • unity3d资源总汇

    2013-02-28 13:52:36
    要学习U3d应用技术,别人的研究不可不参考,借鉴,这也是...Unity3D Blogs 1.http://www.dapp.com.br/ by Dapp 2.http://www.m2h.nl/unity/ by M2H 3.http://www.everyday3d.com/blog/ by Bart
  • 一,场景中创建一个cube,绑定一个cube的移动方法的脚本CubeMove,代码如下: void Update ()  {  //使用虚拟轴移动  float h = Input.GetAxis ("Horizontal");  float v = Input.GetAxis ("...
  • foreach(Transform tran in GetComponentsInChildren()){//遍历当前物体及其所有子物体 tran.gameObject.layer = 30;//更改物体的Layer层 } } 当需要隐藏一部分物体时,可以使用Layer过滤。 在Camera中...
  • 本段主要是为了学习记录,在Unity中怎么给一个BoxCollider添加事件脚本,以点击事件为例,并且,添加物体事件一些必要的前提。 首先是射线检测部分,如下类 AddEeventMonoTest.cs, 其中初始化阶段准备了 必要的一些...
  • sql语句中BEGIN TRAN...COMMIT TRAN
  • //应用户提问 也给大家分享一下 可以查找某个物体下无限层级的子物体名称 并返回该子物体 //把这个函数放到你的代码中 check代表你要查询的物体 name为名称 如return GetTransform... foreach (Tran
  • Unity中删除child

    2016-11-21 21:07:35
    for (int i = 0; i ; i++) { GameObject it = rewardGrid.transform.GetChild(i).gameObject; it.transform.parent = null; Destroy ( it ); } 或者 while (grid.tran
  • SQL事务用法begin tran,commit tran和rollback tran的用法 Sql Server 2005/2008中提供了begin tran,commit tran和rollback tran来使用事务。 begin tran表示开始事务, commit tran表示提交事务, rollback ...
  • unity中,经常遇到的一个问题就是物体移动的问题,Unity引擎给出了很多种解决方案,这里先给大家介绍一种——Transform.Translate函数。   在Unity中这是最基础的一种物体移动的方式之一,物体会按照你给的...
  • 因为工作的需要研究了一下NGUI做
  • Unity3D-C#扩展方法

    2015-12-19 12:17:43
    什么是扩展方法?   扩展方法从字面上理解是指扩展的方法,而对应到面向对象编程这个格局中则是指为一个类提供的扩展方法。按照我们通常的理解,我们首先需要获得某个类的源代码,然后在这个类代码中增加成员方法...
  • 今天用transform.Find()了,跟着 视频一步步敲的! 代码如下: ... void InitProperty() ... iconname_sprite = transform.Find("icon_name").GetComponent();... name_label = transform.Find("property/name_bg
  • Unity3D扩展系统组件

    2017-04-24 16:45:54
    扩展系统组件方便调用提高效率 using System.Collections; using System.Collections.Generic; using UnityEngine; public static class Extension : ... public static void setPosX(this Transform tran
1 2 3 4 5 ... 20
收藏数 39,385
精华内容 15,754
热门标签